Django的会话密钥认证后改变(django session key changing upon

2019-08-04 10:44发布

我有一个Django应用程序,它记录了用户的产品选择两种身份验证的用户。 我的目的是使用request.session.session_key变量匿名数据与用户相关联的,如果他们决定以后注册,一拉这个帖子:

Django的存储匿名用户数据

然而,似乎当寄存器,这样会话密钥可以不再与用户相关的/用户登录会话密钥的变化。 这是Django的会话框架的正确行为。 是否有一个坚实的方式来实现我要找的功能?

任何帮助非常赞赏。

Answer 1:

在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

和会话登录后没有改变



Answer 2:

虽然通过nnmware建议的方法可以对这种特殊情况下的工作,有一个更好的。

而不是仅仅做什么都不里面cycle_key ,我们应调用超级方法,然后保存会话。

因为如果你看原来里面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()


Answer 3:

解决的办法之一也将是更新会话存储旧会话数据:

#!/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)


文章来源: django session key changing upon authentication