django 中的会话数据损坏

Posted

技术标签:

【中文标题】django 中的会话数据损坏【英文标题】:Session data corrupted in django 【发布时间】:2016-12-22 14:07:31 【问题描述】:

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

Session data corrupted

当我尝试注册时,POST 请求状态为 302,但仍然创建了用户,但没有保存任何电子邮件给注册用户。

为什么我会收到这个错误,我该如何解决?

谢谢!

【问题讨论】:

【参考方案1】:

抱歉,这篇文章迟到了,但是您是否更改了项目中的 SECRET_KEY 变量?会话过去是使用这种盐加密的,所以如果你改变它,你已经破坏了你所有的会话,但不要担心!没什么大不了的,最坏的情况是之前存在的会话,那些需要再次登录,就是这样;)

【讨论】:

确保你的不是随机这样 SECRET_KEY = get_random_string(50, chars) 还值得为您的 Django 站点清除所有现有 cookie 以停止看到此消息。【参考方案2】:

有时,当您在同一运行时打开两个不同的项目时,可能会引发此问题。 所以首先停止你的服务器,完全关闭并存在 现在再次打开你的服务器并在新的运行时启动你当前的项目

【讨论】:

【参考方案3】:

这对我有用:

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

【讨论】:

你想怎么用这个?这个函数属于中间件还是其他什么?链接页面为空【参考方案4】:

由于这一行,您收到此错误:https://github.com/django/django/blob/master/django/contrib/sessions/backends/base.py#L109

显然,会话数据的加密出现了严重问题。

如何解决?我不确定,不过我有几个想法:

您是否使用自定义会话类? 您是否在另一个项目中使用您的 Django 会话?

【讨论】:

以上是关于django 中的会话数据损坏的主要内容,如果未能解决你的问题,请参考以下文章

FastAPI 中的会话

Jquery Ajax 发布以更新视图中的 django 会话

Django之cookie与session

如何在Django中访问子模板中的会话变量?

如果我使用 Django South 运行迁移并且它崩溃了,我的数据库是不是曾经损坏?

Django - 数据库支持的会话和基于 Cookie 的会话之间的区别?