6

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

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

有没有办法保留旧的会话数据?还是我的设计方法错了?

4

3 回答 3

3

尝试编写自己的 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_keylogin身份验证后正在视图中调用。

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

于 2012-08-22T07:06:42.907 回答
1

您可以考虑通过and视图上的装饰器恢复值,而不是禁用cycle_key()(这是一种避免会话固定漏洞的安全措施) 。看:loginlogout

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

于 2017-01-25T10:43:14.923 回答
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.
    # ...
于 2016-01-14T19:11:52.190 回答