14

我有一个 Django 应用程序,它记录用户对两个经过身份验证的用户的产品选择。request.session.session_key如果用户决定稍后注册,我的意图是使用该变量将匿名数据与用户相关联,例如这篇文章:

Django 存储匿名用户数据

但是,似乎会话密钥在用户登录/注册时发生了变化,因此会话密钥无法再与用户关联。这是 Django 会话框架的正确行为吗?有没有一种可靠的方法来实现我正在寻找的功能?

非常感谢任何帮助。

4

3 回答 3

12

在 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

登录后会话未更改

于 2013-02-07T17:22:50.367 回答
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()
于 2015-03-03T09:03:52.150 回答
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)
于 2018-04-04T14:52:42.383 回答