Django:如何检测不活动会话超时?

时间:2018-02-11 14:01:22

标签: django session cookies

我正在使用 django.auth.db 连接并创建了一个表,其中包含登录用户的用户名以及用户手动注销时(通过单击注销按钮)我要删除他/她在该表中的用户名。当用户因会话退出而我无法从该表中删除他/她的用户名时,会出现问题。

所以我想知道有什么方法可以检测用户何时' session / cookies out以便我可以从该表中删除他/她的用户名?

2 个答案:

答案 0 :(得分:2)

首先,您需要从会话存储中检索具有活动会话的用户列表,然后您需要将此列表与表中的用户进行比较,并删除表中不在列表中的用户。

您可以从会话商店like so中检索用户列表:

from django.contrib.sessions.models import Session
from django.utils import timezone 

# Query all non-expired sessions
# use timezone.now() instead of datetime.now() in latest versions of Django
sessions = Session.objects.filter(expire_date__gte=timezone.now())
uid_list = []

# Build a list of user ids from that query
for session in sessions:
    data = session.get_decoded()
    uid_list.append(data.get('_auth_user_id', None))

然后你可以循环浏览uid_list并与你的表进行比较,使用一些逻辑,如(说明性的)

for user in table
    if user not in uid_list
        user.remove_from_table()

答案 1 :(得分:1)

您可以使用下一个命令从会话存储中清除所有过期的会话。

django-admin clearsessions

与使用相同的结果:

./manage.py clearsessions

如果将存储配置为数据库,则会从数据库中删除会话。

文档: https://docs.djangoproject.com/en/dev/ref/django-admin/#django-contrib-sessions

如果您想在视图中执行此操作,可以调用方法clear_expired()

request.session.clear_expired()

文档:https://docs.djangoproject.com/en/2.0/topics/http/sessions/#django.contrib.sessions.backends.base.SessionBase.clear_expired