这可能是不可能的,但是当某些条件发生时,我想修改某些登录用户的会话数据(标记下次加载页面时需要运行一些额外的逻辑)。 / p>
有没有办法通过ID访问用户的会话?
答案 0 :(得分:4)
tldr; 查询Session
模型,然后通过SessionStore
修改匹配的会话。
您的问题有两个,如何获取用户的会话,以及如何修改任意会话的数据(可能在视图之外)。
由于会话数据以编码形式存储,我建议获取所有未过期的会话,迭代它们,解码数据并检查是否与用户相关联。收集匹配的会话密钥以便以后执行。
from datetime import datetime
>>> sessions = Session.objects.exclude(expire_date__lte=datetime.now())
# [<Session: Session object>, <Session: Session object>]
>>> logged_in = [s.session_key for s in sessions if s.get_decoded().get('_auth_user_id')]
# [u'qu1ir36jjvgbq2koqfa37b9hw1kb3ssu']
虽然没有明确说明方案,the docs do mention如何在没有request
上下文的情况下访问会话。基本上,SessionStore
必须用于修改会话(而后者会将新数据存储在Session
)
from django.contrib.sessions.backends.db import SessionStore
# look up our sessions in session store
for session_key in logged_in:
s = SessionStore(session_key=session_key)
s['test'] = True
s.save()
s.modified
# True