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 中的会话数据损坏的主要内容,如果未能解决你的问题,请参考以下文章
Jquery Ajax 发布以更新视图中的 django 会话