【发布时间】:2023-03-22 01:38:01
【问题描述】:
这可能是不可能的,但是当某些情况发生时,我想修改某些登录用户的会话数据(标记下一次加载页面时需要运行一些额外的逻辑)。
有没有办法通过用户 ID 访问用户的会话?
【问题讨论】:
标签: django session django-sessions
这可能是不可能的,但是当某些情况发生时,我想修改某些登录用户的会话数据(标记下一次加载页面时需要运行一些额外的逻辑)。
有没有办法通过用户 ID 访问用户的会话?
【问题讨论】:
标签: django session django-sessions
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
【讨论】: