【发布时间】:2015-09-01 02:27:14
【问题描述】:
当用户登录时,一些详细信息会保存到会话中,比如说使用 key='user_settings'
当系统内发生一些更新时,我需要遍历所有用户并从每个用户会话中删除“user_settings”键。这样我将触发从数据库中加载新的详细信息。
如何循环遍历所有会话并从每个会话中删除密钥?
【问题讨论】:
当用户登录时,一些详细信息会保存到会话中,比如说使用 key='user_settings'
当系统内发生一些更新时,我需要遍历所有用户并从每个用户会话中删除“user_settings”键。这样我将触发从数据库中加载新的详细信息。
如何循环遍历所有会话并从每个会话中删除密钥?
【问题讨论】:
即使您的站点只有几千个用户,您也可能会发现 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 clearsessions 来清理过期的会话。未过期的将被保留。
也许禁食是用sql查询删除所有会话。其中检索和删除将非常缓慢并且涉及数百万个查询。
对于支持 TRUNCATE 的数据库
TRUNCATE django_session
对于那些不喜欢的人
DELETE FROM django_session
最后请记住,会话确实会不时过期,因此清除整个会话对象而不是仅仅删除特定键并没有太大的危害
【讨论】:
您可以像任何其他字典一样从会话中删除密钥。
del request.session['your key']
欲了解更多信息,请查看此内容
How do I delete a session key in Django after it is used once?
【讨论】:
您可以通过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()
【讨论】: