如何在 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 中再次登录时可以找到它们?