django中的会话数据损坏

avkwfej4  于 2023-04-13  发布在  Go
关注(0)|答案(5)|浏览(136)

每次当我去我的注册页面,我收到这个错误

Session data corrupted

当我试图注册无论如何,POST请求状态是302,但用户仍然被创建,但没有保存任何电子邮件注册用户.
为什么我会得到这个错误,我如何修复它?
谢谢!

nbysray5

nbysray51#

很抱歉我来晚了,但是你有没有改变你项目中的SECRET_KEY变量?会话曾经使用这个salt加密,所以如果你改变了它,你已经破坏了所有的会话,但是不要担心!这不是一个大问题,最坏的情况是对于在此之前存在的会话,这些会话将需要再次登录,就是这样;)

55ooxyrt

55ooxyrt2#

你会得到这个错误是因为这一行:https://github.com/django/django/blob/master/django/contrib/sessions/backends/base.py#L109
显然,会话数据的加密出了严重的问题。
怎么解决呢?我不确定,不过我有几个想法:

  • 您是否使用自定义会话类?
  • 你是否在其他项目中使用Django会话?
xzv2uavs

xzv2uavs3#

有时,当您在同一运行时打开两个不同的项目时,会发生此问题。
首先,停止服务器,完全关闭并退出。
现在,再次打开服务器,并在全新的运行时上启动当前项目。

rjee0c15

rjee0c154#

这对我很有效:

import base64
import hashlib
import hmac
import json

def session_utoken(msg, secret_key, class_name='SessionStore'):
    key_salt = "django.contrib.sessions" + class_name
    sha1 = hashlib.sha1((key_salt + secret_key).encode('utf-8')).digest()
    utoken = hmac.new(sha1, msg=msg, digestmod=hashlib.sha1).hexdigest()
    return utoken

def decode(session_data, secret_key, class_name='SessionStore'):
    encoded_data = base64.b64decode(session_data)
    utoken, pickled = encoded_data.split(b':', 1)
    expected_utoken = session_utoken(pickled, secret_key, class_name)
    if utoken.decode() != expected_utoken:
        raise BaseException('Session data corrupted "%s" != "%s"',
                            utoken.decode(),
                            expected_utoken)
    return json.loads(pickled.decode('utf-8'))

s = Session.objects.get(session_key=session_key)
decode(s.session_data, 'YOUR_SECRET_KEY'))

来源:http://joelinoff.com/blog/?p=920

xdyibdwo

xdyibdwo5#

我在本地工作,并通过删除127.0.0.1浏览器的cookie来修复“会话数据损坏”问题。

相关问题