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

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

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

谢谢!

【问题讨论】:

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

标签: python django session django-sessions


【解决方案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+
猜你喜欢
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
  • 2011-09-25
  • 1970-01-01
  • 2023-03-29
相关资源
最近更新 更多