我有一个 Django 应用程序,它记录用户对两个经过身份验证的用户的产品选择。request.session.session_key
如果用户决定稍后注册,我的意图是使用该变量将匿名数据与用户相关联,例如这篇文章:
但是,似乎会话密钥在用户登录/注册时发生了变化,因此会话密钥无法再与用户关联。这是 Django 会话框架的正确行为吗?有没有一种可靠的方法来实现我正在寻找的功能?
非常感谢任何帮助。
我有一个 Django 应用程序,它记录用户对两个经过身份验证的用户的产品选择。request.session.session_key
如果用户决定稍后注册,我的意图是使用该变量将匿名数据与用户相关联,例如这篇文章:
但是,似乎会话密钥在用户登录/注册时发生了变化,因此会话密钥无法再与用户关联。这是 Django 会话框架的正确行为吗?有没有一种可靠的方法来实现我正在寻找的功能?
非常感谢任何帮助。
在 settings.py
SESSION_ENGINE = 'youapp.session_backend'
在文件 session_backend.py 中的目录 youapp 中
from django.contrib.sessions.backends.db import SessionStore as DbSessionStore
class SessionStore(DbSessionStore):
def cycle_key(self):
pass
登录后会话未更改
虽然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()
解决方案之一也是更新会话存储中的旧会话数据:
#!/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)