登录后保留Django会话数据?

时间:2012-08-22 03:03:18

标签: django session-state

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

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

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

3 个答案:

答案 0 :(得分:2)

尝试编写自己继承的SessionBackend并覆盖cycle_key方法。

1在settings.py

SESSION_ENGINE = 'my_app.session_backend'

2 my_app.session_backend.py

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

class SessionStore(DbSessionStore):
    def cycle_key(self):
        pass

cycle_key在认证后在login视图中调用。

现在让我,如果它有效;)

答案 1 :(得分:0)

我试图做类似的事情。 Django可以更改session_key以缓解会话固定漏洞,因此它不适合外键。我想要一些更永久的东西。所以我只是将永久标识符放在request.session['visitor_id']

from django.utils.crypto import get_random_string
import string

VALID_KEY_CHARS = string.ascii_lowercase + string.digits

def example_view(request):
    if not request.session.get('visitor_id'):
        self.request.session['visitor_id'] = get_random_string(32, VALID_KEY_CHARS)
    # Now code the rest of the view, using the visitor_id instead of
    # session_key for keys in your model.
    # ...

答案 2 :(得分:0)

您可以考虑通过cycle_key()login视图中的装饰器来恢复值,而不是禁用logout(这是避免会话固定漏洞的安全措施)。参见:

https://stackoverflow.com/a/41849076/146289