登录后保留Django会话数据?

Aar*_*uyn 5 django session-state

我最近编写了依赖于Session对象的购物车代码.这似乎是为匿名用户存储数据的合理方式.

在进行大量测试时,我遇到了一个恼人的问题 - 当用户在结帐过程中部分登录时(或者只是在浏览其他产品时),Django会发出新的session_key,但我无法访问会话数据.

有没有办法保留旧的会话数据?或者我的设计方法是错误的?

raf*_*fek 3

尝试编写您自己的 SessionBackend,继承现有的 SessionBackend 并重写该cycle_key方法。

1 在您的settings.py

SESSION_ENGINE = 'my_app.session_backend'
Run Code Online (Sandbox Code Playgroud)

2 my_app.session_backend.py

from django.contrib.sessions.backends.db import SessionStore as DbSessionStore

class SessionStore(DbSessionStore):
    def cycle_key(self):
        pass
Run Code Online (Sandbox Code Playgroud)

cycle_key身份验证后正在视图中调用login

现在让我看看是否有效;)

  • 显然我无法将样式代码添加到注释中。这是我稍微扩展的解决方案。谢谢拉菲克!https://gist.github.com/3473470 (7认同)
  • 这引入了一个安全漏洞 - Django 专门循环密钥以减轻会话固定攻击。Django 文档:https://docs.djangoproject.com/en/1.8/topics/http/sessions/#django.contrib.sessions.backends.base.SessionBase.cycle_key - OWASP 文档:https://www.owasp.org /index.php/Session_fixation (4认同)
  • -1。这可能会解决问题,但禁用安全机制不是您应该做的事情。请参阅@AaronC.deBruyn 的解决方案以获得更好的方法。 (2认同)
  • @AaronC.deBruyn,对死灵术表示歉意 - 试图理解您的解决方案,您是否忘记在异常处理程序中调用“super().cycle_key()”,或者您是否故意避免这样做?(谈论https://gist.github.com/darkpixel/3473470) (2认同)