我最近编写了依赖于Session对象的购物车代码。这似乎是为匿名用户存储数据的合理方式。
在进行大量测试时,我遇到了一个恼人的问题 - 当用户在结帐过程中部分登录时(或者只是在浏览其他产品时),Django会发出新的session_key并且我无法访问我的会话数据
有没有办法保留旧的会话数据?或者我的设计方法是错误的?
答案 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
(这是避免会话固定漏洞的安全措施)。参见: