gpt4 book ai didi

python - 从 Django 1.4 升级到 1.6 后在管理中保存对象时列出索引超出范围错误

转载 作者:太空宇宙 更新时间:2023-11-03 18:29:37 25 4
gpt4 key购买 nike

我最近将 1.4 项目升级到 1.6,在解决了一些弃用问题后,我遇到了另一个我无法解决的问题。

每次我尝试保存新对象或编辑现有对象时,我都会收到 list index out of range错误。我理解错误的含义,但不知道 django 如何设置 obj 的值它的值应该是 obj[3]回溯将我发送到这里:django/contrib/messages/storage/cookie.py in process_messages, line 38

完整回溯:

   Traceback:
File "/Users/user/Development/virtual_environments/demo/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
201. response = middleware_method(request, response)
File "/Users/user/Development/virtual_environments/demo/lib/python2.7/site-packages/django/contrib/messages/middleware.py" in process_response
23. unstored_messages = request._messages.update(response)
File "/Users/user/Development/virtual_environments/demo/lib/python2.7/site-packages/django/contrib/messages/storage/base.py" in update
140. messages = self._loaded_messages + self._queued_messages
File "/Users/user/Development/virtual_environments/demo/lib/python2.7/site-packages/django/contrib/messages/storage/base.py" in _loaded_messages
91. messages, all_retrieved = self._get()
File "/Users/user/Development/virtual_environments/demo/lib/python2.7/site-packages/django/contrib/messages/storage/fallback.py" in _get
24. messages, all_retrieved = storage._get()
File "/Users/user/Development/virtual_environments/demo/lib/python2.7/site-packages/django/contrib/messages/storage/cookie.py" in _get
70. messages = self._decode(data)
File "/Users/user/Development/virtual_environments/demo/lib/python2.7/site-packages/django/contrib/messages/storage/cookie.py" in _decode
154. return json.loads(value, cls=MessageDecoder)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py" in loads
339. return cls(encoding=encoding, **kw).decode(s)
File "/Users/user/Development/virtual_environments/demo/lib/python2.7/site-packages/django/contrib/messages/storage/cookie.py" in decode
49. return self.process_messages(decoded)
File "/Users/user/Development/virtual_environments/demo/lib/python2.7/site-packages/django/contrib/messages/storage/cookie.py" in process_messages
41. return [self.process_messages(item) for item in obj]
File "/Users/user/Development/virtual_environments/demo/lib/python2.7/site-packages/django/contrib/messages/storage/cookie.py" in process_messages
38. print 'OBJECT 3: {0}'.format(obj[3])

来自 cookies.py 的代码。问题在于试图获取 obj[3]obj 的值为:[u'__json_message', 20, u'The Player "Goodman" was changed successfully.']

class MessageDecoder(json.JSONDecoder):                            
"""
Decodes JSON that includes serialized ``Message`` instances.
"""

def process_messages(self, obj):
if isinstance(obj, list) and obj:
if obj[0] == MessageEncoder.message_key:
if obj[1]:
print obj
print 'OBJECT 3: {0}'.format(obj[3])
obj[3] = mark_safe(obj[3])
return Message(*obj[2:])
return [self.process_messages(item) for item in obj]
if isinstance(obj, dict):
return dict([(key, self.process_messages(value))
for key, value in six.iteritems(obj)])
return obj

def decode(self, s, **kwargs):
decoded = super(MessageDecoder, self).decode(s, **kwargs)
return self.process_messages(decoded)

最佳答案

该错误是由“messages”cookie 格式的更改引起的,导致 Django 1.6 无法反序列化 Django 1.4 消息 cookie。

Django 1.5 包含一个修复程序,使其支持两种格式,但此修复程序尚未出现在 Django 1.6 中。

我已报告 issue为此。

同时,您可以使用以下中间件来删除旧格式的 cookie:

from django.contrib.messages.storage.cookie import CookieStorage
class FixMessageMiddleware(object):
"""
The message cookie format has changed from Django 1.4 to
Django 1.5. Django 1.5 probably supported both formats,
but if you move from 1.4.x to 1.6.x directly, you will run into
an IndexError:

Exception Type: IndexError
Exception Value:
list index out of range
Exception Location: (...) django/contrib/messages/storage/cookie.py in process_messages, line 37

This small piece of middleware will track those cookies and destroy
them (leaving new-style in tact)

https://code.djangoproject.com/ticket/22426

DISCLAIMER:
This middleware will not attempt to rewrite the messages! You may
miss important notifications because of this!
"""
def process_request(self, request):
data = request.COOKIES.get("messages")
storage = CookieStorage(request)
try:
storage._decode(data)
except IndexError:
del request.COOKIES['messages']

我也 blogged关于这个问题(这就是上面的中间件的来源)

关于python - 从 Django 1.4 升级到 1.6 后在管理中保存对象时列出索引超出范围错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22580922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com