在django中,我可以使用以下方式注销用户:
from django.contrib.auth import logout
logout(request)
但是,我将如何手动注销使用-例如,我要“使用户退出所有标签页”-也就是说,如何刷新数据库中该用户的所有会话?
答案 0 :(得分:2)
您可以将以下方法添加到您的用户对象中:
from django.utils import timezone
from django.contrib.sessions.models import Session
class User(models.model):
...
def remove_all_sessions(self):
user_sessions = []
all_sessions = Session.objects.filter(expire_date__gte=timezone.now())
for session in Session.objects.all():
if str(self.pk) == session.get_decoded().get('_auth_user_id'):
user_sessions.append(session.pk)
return Session.objects.filter(pk__in=user_sessions).delete()
答案 1 :(得分:0)
要了解此问题,请考虑数据库后端会发生什么。当用户登录时,Django在django_session数据库表中添加一行。每次会话数据更改时,Django都会更新此行。如果用户手动注销,则Django删除该行。但是,如果用户未注销,则该行将永远不会被删除。文件后端也会发生类似的过程。
Django不提供对过期会话的自动清除。因此,定期清除过期的会话是您的工作。 Django为此提供了一个清理管理命令:clearsessions
。建议定期调用此命令,例如,作为日常cron作业。
请注意,缓存后端不容易受到此问题的影响,因为缓存会自动删除陈旧数据。 Cookie也不支持,因为会话数据是由用户的浏览器存储的。
因此运行:
$ ./manage.py clearsessions
答案 2 :(得分:0)
您可以遍历数据库中的所有会话,对所有会话进行解码,然后删除属于该用户的会话。但这很慢,尤其是在您的网站流量高且会话很多的情况下。
如果您需要更快的解决方案,则可以使用会话后端,该后端可让您查询并获取特定用户的会话。在这些会话后端中,会话具有用户的外键,因此您无需遍历所有会话对象:
db
,cached_db
会话后端)db
会话后端)使用这些后端,删除用户的所有会话可以在一行代码中完成:
user.session_set.all().delete()
免责声明::我是django-qsessions
的作者。