【问题标题】: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 信号,但这显然仅在用户通过注销手动使会话到期时才有效,它不适用于由于不活动而到期的会话
-
标签:
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+