django会话密钥在认证时改变

时间:2012-12-20 19:07:18

标签: django django-admin django-views

我有一个Django应用程序,可以为两个经过身份验证的用户记录用户的产品选择。我的意图是使用request.session.session_key变量将匿名数据与用户相关联,如果他们决定稍后注册,那么这篇帖子就是这样的:

Django storing anonymous user data

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

任何帮助都非常感激。

3 个答案:

答案 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)