从所有用户删除会话密钥

时间:2015-06-16 10:15:30

标签: django django-sessions

当用户登录时,某些详细信息会保存到会话中,让我们说使用key =' user_settings'

当系统内发生某些更新时,我需要遍历所有用户并删除' user_settings'来自每个用户会话的密钥。这样我就会触发从数据库中加载新鲜的细节。

如何遍历所有会话并从每个会话中删除密钥?

3 个答案:

答案 0 :(得分:12)

循环

即使您的网站只有几千个用户,您也可能会发现django_sessions表中有几百万个条目。如果会话尚未清理,则会发生这种情况。如果您遍历它们并删除会话条目,您会发现该过程非常慢。即使是100个会话也会导致100个查询被执行。

使用会话模型。

您可以在django.contrib.sessions.models.Session上应用过滤器,就像在任何其他模型上一样。因此,以下查询将一次性清除所有会话。

 from django.contrib.sessions.models import Session
 Session.objects.all().delete()

你可以选择遗漏一些用户

 Session.objects.filter(session_key__in = [ ... ]).delete()

它不涉及数据检索或循环。

./ manage.py

您还可以使用./manage.py clearsessions清除过期的会话。未保留的将被保留。

在数据库级

也许禁食是删除所有会话是用SQL查询。检索和删除的速度非常慢,涉及数百万次查询。

对于支持TRUNCATE的数据库

TRUNCATE django_session

对于那些没有

的人
DELETE FROM django_session

最后请记住,会话会不时到期,因此清除整个会话对象而不仅仅是删除特定密钥并没有太大的危害

答案 1 :(得分:6)

您可以通过SessionStore object

访问和更新会话数据
from django.contrib.sessions.models import Session, SessionStore

for session in Session.objects.all():
    store = SessionStore(session.session_key)
    del store['user_settings']
    store.save()

答案 2 :(得分:0)

您可以像其他字典一样从会话中删除密钥。

del request.session['your key']

了解更多信息,请查看

How do I delete a session key in Django after it is used once?