如何在Django中注销用户(无请求)

时间:2018-10-24 03:15:13

标签: python django

在django中,我可以使用以下方式注销用户:

from django.contrib.auth import logout
logout(request)

但是,我将如何手动注销使用-例如,我要“使用户退出所有标签页”-也就是说,如何刷新数据库中该用户的所有会话?

3 个答案:

答案 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)

您可以遍历数据库中的所有会话,对所有会话进行解码,然后删除属于该用户的会话。但这很慢,尤其是在您的网站流量高且会话很多的情况下。

如果您需要更快的解决方案,则可以使用会话后端,该后端可让您查询并获取特定用户的会话。在这些会话后端中,会话具有用户的外键,因此您无需遍历所有会话对象:

使用这些后端,删除用户的所有会话可以在一行代码中完成:

user.session_set.all().delete()

免责声明::我是django-qsessions的作者。