从所有用户删除会话密钥

Mik*_*ael 9 django django-sessions

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

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

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

e4c*_*4c5 12

循环

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

使用会话模型.

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

 from django.contrib.sessions.models import Session
 Session.objects.all().delete()
Run Code Online (Sandbox Code Playgroud)

你可以选择遗漏一些用户

 Session.objects.filter(session_key__in = [ ... ]).delete()
Run Code Online (Sandbox Code Playgroud)

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

./manage.py

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

在数据库级别

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

对于支持TRUNCATE的数据库

TRUNCATE django_session
Run Code Online (Sandbox Code Playgroud)

对于那些没有

DELETE FROM django_session
Run Code Online (Sandbox Code Playgroud)

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


gar*_*rtb 6

您可以通过SessionStore对象访问和更新会话数据:

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()
Run Code Online (Sandbox Code Playgroud)