django会话密钥在身份验证时更改

django会话密钥在身份验证时更改,django,django-admin,django-views,Django,Django Admin,Django Views,我有一个Django应用程序,它记录用户对两个经过身份验证的用户的产品选择。我的意图是使用request.session.session\u key变量将匿名数据与用户关联,如果他们决定稍后注册,则此帖子的一个la: 但是,当用户登录/注册时,会话密钥似乎会发生变化,因此会话密钥不再与用户关联。这是Django会话框架的正确行为吗。是否有一个可靠的方法来实现我所寻找的功能 非常感谢您的帮助。在settings.py中 SESSION_ENGINE = 'yourapp.session_back

我有一个Django应用程序,它记录用户对两个经过身份验证的用户的产品选择。我的意图是使用
request.session.session\u key
变量将匿名数据与用户关联,如果他们决定稍后注册,则此帖子的一个la:

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

非常感谢您的帮助。

在settings.py中

SESSION_ENGINE = 'yourapp.session_backend'
会话\u引擎='youapp.SESSION\u后端'

在目录youapp in file session_backend.py中

from django.contrib.sessions.backends.db import SessionStore as DbSessionStore

class SessionStore(DbSessionStore):
    def cycle_key(self):
        pass

登录后会话未更改虽然nnmware建议的方法可能适用于这种特殊情况,但有一种更好的方法

我们应该调用super方法,然后保存会话,而不是在
cycle\u key
中什么都不做

因为如果查看原始的
cycle\u key
功能,您将看到旧会话中的数据被复制到新会话中,但实际上并未保存

在settings.py中

SESSION_ENGINE = 'yourapp.session_backend'
检查会话引擎是否指向模块(.py文件),而不是后端类

现在,在“yourapp/session\u 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)

请注意,会话密钥的这种更改在一定程度上有助于防止会话固定。因此,在关掉它之前考虑一下。我不太确定这是否更好,取决于你是否依赖旧会话的信息(它直接引用它的对象,或者它的密钥),在这种情况下,你需要旧的一个保持一致,这样你就可以将它绑定到登录事件之前跟踪的记录。对我来说,仅仅是停止循环就行了,希望不会引起问题。这对我来说是行的,但我不能确认它是完全安全的。我使用字符串匹配在登录跳转上加入会话密钥。