【发布时间】:2018-07-21 18:53:04
【问题描述】:
我正在使用 django.auth.db 连接并创建了一个表,其中包含已登录用户的用户名以及当用户手动注销时(通过单击注销按钮)我正在删除该表中的他/她的用户名。当用户由于会话退出而退出并且我无法从该表中删除他/她的用户名时会出现问题。
所以我想知道有什么方法可以检测用户的会话/cookie 何时退出,以便我可以从该表中删除他/她的用户名?
【问题讨论】:
我正在使用 django.auth.db 连接并创建了一个表,其中包含已登录用户的用户名以及当用户手动注销时(通过单击注销按钮)我正在删除该表中的他/她的用户名。当用户由于会话退出而退出并且我无法从该表中删除他/她的用户名时会出现问题。
所以我想知道有什么方法可以检测用户的会话/cookie 何时退出,以便我可以从该表中删除他/她的用户名?
【问题讨论】:
首先,您需要从会话存储中检索具有活动会话的用户列表,然后您需要将此列表与表中的用户进行比较,并删除表中不在列表中的用户。
您可以从会话存储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()
【讨论】:
您可以使用下一条命令从会话存储中清除所有过期的会话。
django-admin clearsessions
与使用相同的结果:
./manage.py clearsessions
如果您将存储配置为数据库,那么它将从数据库中删除会话。
文档: https://docs.djangoproject.com/en/dev/ref/django-admin/#django-contrib-sessions
如果你想在你的视图中做,你可以调用方法clear_expired():
request.session.clear_expired()
【讨论】: