修改不同Django用户的会话数据

时间:2015-04-15 16:59:48

标签: django session django-sessions

这可能是不可能的,但是当某些条件发生时,我想修改某些登录用户的会话数据(标记下次加载页面时需要运行一些额外的逻辑)。 / p>

有没有办法通过ID访问用户的会话?

1 个答案:

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