簡體   English   中英

從Django 1.4升級到1.6后將對象保存在admin中時,列表索引超出范圍錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM