[英]list index out of range error when saving objects in admin after upgrade from Django 1.4 to 1.6
我最近將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]
的值是: [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)
該錯誤是由於“消息” cookie格式的更改引起的,導致Django 1.6無法反序列化Django 1.4消息cookie。
Django 1.5包含一個支持這兩種格式的修復程序,但是Django 1.6中尚未提供此修復程序。
我已經為此報告了一個問題 。
同時,您可以使用以下中間件刪除舊格式的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']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.