我最近编写了依赖于 Session 对象的购物车代码。这似乎是为匿名用户存储数据的合理方式。
在进行大量测试时,我遇到了一个烦人的问题——当用户在结帐过程中(或只是在浏览其他产品时)部分登录时,Django 发出一个新的 session_key,我无法访问我的会话数据。
有没有办法保留旧的会话数据?还是我的设计方法错了?
我最近编写了依赖于 Session 对象的购物车代码。这似乎是为匿名用户存储数据的合理方式。
在进行大量测试时,我遇到了一个烦人的问题——当用户在结帐过程中(或只是在浏览其他产品时)部分登录时,Django 发出一个新的 session_key,我无法访问我的会话数据。
有没有办法保留旧的会话数据?还是我的设计方法错了?
尝试编写自己的 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
身份验证后正在视图中调用。
如果它有效,现在让我;)
您可以考虑通过and视图上的装饰器恢复值,而不是禁用cycle_key()
(这是一种避免会话固定漏洞的安全措施) 。看:login
logout
我正在尝试做类似的事情。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.
# ...