【问题标题】:Modify session data of different Django user修改不同Django用户的会话数据
【发布时间】:2023-03-22 01:38:01
【问题描述】:

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

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

【问题讨论】:

    标签: django session django-sessions


    【解决方案1】:

    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
    

    【讨论】:

    • 哇,太棒了。我确定(这证实了这一点)它有点过于反模式了。在我的情况下,最好只在用户表中标记它。谢谢你的回答!
    猜你喜欢
    • 2011-01-11
    • 2015-10-01
    • 2012-06-26
    • 2015-07-17
    • 2011-06-17
    • 2021-08-18
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    相关资源
    最近更新 更多