我有一个Django应用程序,可以为两个经过身份验证的用户记录用户的产品选择。我的意图是使用request.session.session_key
变量将匿名数据与用户相关联,如果他们决定稍后注册,那么这篇帖子就是这样的:
Django storing anonymous user data
但是,当用户登录/注册时,会话密钥似乎会发生变化,因此会话密钥不再与用户关联。这是Django会话框架的正确行为吗?有没有可靠的方法来实现我正在寻找的功能?
任何帮助都非常感激。
答案 0 :(得分:10)
在settings.py中
SESSION_ENGINE ='youapp.session_backend'
在目录youapp文件session_backend.py
中from django.contrib.sessions.backends.db import SessionStore as DbSessionStore
class SessionStore(DbSessionStore):
def cycle_key(self):
pass
登录后会话未更改
答案 1 :(得分:5)
虽然 nnmware 建议的方法可能适用于这种特殊情况,但还有一个更好的方法。
我们不应该只在cycle_key
内做任何事情,而应该调用super方法,然后保存会话。
因为如果查看原始cycle_key
函数,您会看到旧会话中的数据被复制到新会话中,但实际上并未保存。
在settings.py中
SESSION_ENGINE = 'yourapp.session_backend'
检查SESSION_ENGINE是否指向模块(.py文件),但不是指向后端类!
现在,在您的' yourapp / session_backend.py'执行以下操作:
from django.contrib.sessions.backends.db import SessionStore as DbSessionStore
class SessionStore(DbSessionStore):
def cycle_key(self):
super(SessionStore, self).cycle_key()
self.save()
答案 2 :(得分:1)
其中一个解决方案也是更新会话存储中的旧会话数据:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from django.contrib.sessions.backends.db import SessionStore as DbSessionStore
from shop.models.cart import Cart
class SessionStore(DbSessionStore):
def cycle_key(self):
old_session_key = super(SessionStore, self).session_key
super(SessionStore, self).cycle_key()
self.save()
Cart.objects.filter(session_key=old_session_key).update(session_key=self.session_key)