如何在Django中跟踪用户会话的长度

时间:2015-02-06 19:37:26

标签: python django session django-sessions

有没有办法可以跟踪Django中会话的存在时间?

有没有办法让Django在会话到期时运行一个函数?这将允许我这样做。

谢谢!

1 个答案:

答案 0 :(得分:3)

正如@TimmyO'Mahony所提到的,你可以使用user_logged_out信号来处理由于注销而导致的会话结束。

由于不活动,您可以使用中间件来处理会话到期。中间件看起来像:

import time
from django.contrib.auth import logout

SESSION_TIMEOUT = 5400 # 90 minutes

class HandleSessionExpiryMiddleware(object):
    def process_request(self, request):
        last_activity = request.session.get('last_activity')
        now = time.time()
        idle = now - last_activity if last_activity else 0

        timeout = SESSION_TIMEOUT

        if idle > timeout:
            run_on_expiry()
            logout(session)
        else:
            request.session['last_activity'] = now
            idle = 0

    def run_on_expiry(self):
        # Custom code

假设上述代码位于文件sessions/middleware.py中,您需要将此中间件添加到MIDDLEWARE_CLASSES中的settings.py,例如:

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'sessions.middleware.HandleSessionExpiryMiddleware',
    ...
)

希望这有帮助!