【问题标题】:Delete session key from all users从所有用户中删除会话密钥
【发布时间】:2015-09-01 02:27:14
【问题描述】:

当用户登录时,一些详细信息会保存到会话中,比如说使用 key='user_settings'

当系统内发生一些更新时,我需要遍历所有用户并从每个用户会话中删除“user_settings”键。这样我将触发从数据库中加载新的详细信息。

如何循环遍历所有会话并从每个会话中删除密钥?

【问题讨论】:

    标签: django django-sessions


    【解决方案1】:

    循环

    即使您的站点只有几千个用户,您也可能会发现 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

    ​​>

    您也可以使用./manage.py clearsessions 来清理过期的会话。未过期的将被保留。

    在数据库级别

    也许禁食是用sql查询删除所有会话。其中检索和删除将非常缓慢并且涉及数百万个查询。

    对于支持 TRUNCATE 的数据库

    TRUNCATE django_session
    

    对于那些不喜欢的人

    DELETE FROM django_session
    

    最后请记住,会话确实会不时过期,因此清除整个会话对象而不是仅仅删除特定键并没有太大的危害

    【讨论】:

      【解决方案2】:

      您可以像任何其他字典一样从会话中删除密钥。

      del request.session['your key']
      

      欲了解更多信息,请查看此内容

      How do I delete a session key in Django after it is used once?

      【讨论】:

        【解决方案3】:

        您可以通过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()
        

        【讨论】:

          猜你喜欢
          • 2016-12-05
          • 2014-07-08
          • 2012-10-24
          • 1970-01-01
          • 2013-11-11
          • 1970-01-01
          • 2014-07-16
          • 2023-03-30
          • 1970-01-01
          相关资源
          最近更新 更多