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

Posted

技术标签:

【中文标题】如何在 Django 中跟踪用户会话的长度【英文标题】:How to track the length of a user session in Django 【发布时间】:2015-04-07 01:08:57 【问题描述】:

有没有一种方法可以跟踪 Django 中会话存在的时间长度?

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

谢谢!

【问题讨论】:

最好的办法是每 X 分钟运行一次 celery 任务,检查会话数据库以查看哪些会话已过期。您可以使用user_logged_out 信号,但这显然仅在用户通过注销手动使会话到期时才有效,它不适用于由于不活动而到期的会话 @TimmyO'Mahony 谢谢!好主意 【参考方案1】:

正如@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 中,您需要将此中间件添加到您的settings.py 中的MIDDLEWARE_CLASSES,例如:

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

希望这会有所帮助!

【讨论】:

对于那些像我一样在谷歌搜索时发现这一点的人,请记住,通过this question从对象继承自定义中间件不再适用于 Django 1.10+

以上是关于如何在 Django 中跟踪用户会话的长度的主要内容,如果未能解决你的问题,请参考以下文章

Django之cookie与session

如何将会话变量连接到 Django 中的登录用户?

注销后如何保存购物车数据的会话,以便用户在 Django 中再次登录时可以找到它们?

如何在 django 中关闭浏览器上的会话

Django 如何在第一次迁移时制作与用户、身份验证、组、会话等相关的表?

Python Flask:跟踪用户会话?如何获取会话 Cookie ID?