2013-03-21 140 views
13

我正在處理django項目,並收到此錯誤電子郵件。django UnreadablePostError:請求數據讀取錯誤

堆棧跟蹤

File "/usr/local/lib/python2.7/dist-packages/Django-1.4.3-py2.7.egg/django/core/handlers/wsgi.py", line 180, in _get_post 
    self._load_post_and_files() 

File "/usr/local/lib/python2.7/dist-packages/Django-1.4.3-py2.7.egg/django/http/__init__.py", line 379, in _load_post_and_files 
    self._post, self._files = QueryDict(self.body, encoding=self._encoding), MultiValueDict() 

File "/usr/local/lib/python2.7/dist-packages/Django-1.4.3-py2.7.egg/django/http/__init__.py", line 335, in body 
    self._body = self.read() 

File "/usr/local/lib/python2.7/dist-packages/Django-1.4.3-py2.7.egg/django/http/__init__.py", line 391, in read 
    return self._stream.read(*args, **kwargs) 

File "/usr/local/lib/python2.7/dist-packages/Django-1.4.3-py2.7.egg/django/core/handlers/wsgi.py", line 98, in read 
    result = self.buffer + self._read_limited() 

File "/usr/local/lib/python2.7/dist-packages/Django-1.4.3-py2.7.egg/django/core/handlers/wsgi.py", line 92, in _read_limited 
    result = self.stream.read(size) 

UnreadablePostError: request data read error 

爲什麼這個錯誤是怎麼回事?
如何解決?

+10

這些都是破碎的請求。例如。有人在發佈內容時取消了請求。你可以忽略它們。但是你可能想檢查一下發生在哪一頁上。也許你的應用程序花費太多時間來加載某些東西。 – 2013-03-21 10:02:34

+4

@Bibhas我曾經與最糟糕的QA合作,他們的想法是「壓力測試」在瀏覽器中壓低了「F5」。其中很多彈出。 :) – dmg 2013-03-21 10:07:09

+0

:D人和他們瘋狂的邏輯。 :P順便說一句,我應該發表評論作爲答案?它並沒有真正說出如何解決它。我也不確定你是如何處理破損的請求的。 – 2013-03-21 10:10:44

回答

11

Why this error is happening ?

因爲服務器收到格式錯誤的請求,這可能會發生,原因很多。有人可能已經取消了加載頁面,有人可能有一個蹩腳的互聯網連接切斷,宇宙射線本來可以翻轉

這不是你真正需要擔心的事情,除非它經常發生。你可能想在這些錯誤發生時記錄下來,看看它是否在相同的頁面上。

How to solve?

你不能。至少在這一點上不是。收集更多關於何時發生此錯誤的數據。看看你是否可以找到手動觸發它的方法。

3

隨着應用程序的規模,你總會得到偶爾取消的請求。如果您收到500封電子郵件,可能會很乏味。

我不會建議完全忽略它們。如果UnreadablePostErrors正在涌入,那麼出現錯誤,例如較長的響應時間會導致用戶取消請求。

我的解決方案是忽略1/20 UnreadablePostErrors。這樣,如果出現問題,我仍然會被告知,但我會減少20倍。這有點髒,但它對我有用。

import logging 
import random 
from django.http import UnreadablePostError 

class ReduceUnreadablePostErrors(logging.Filter): 
    def filter(self, record): 
     if record.exc_info: 
      exc_value = record.exc_info[1] 
      if isinstance(exc_value, UnreadablePostError): 
       return random.randint(1,20) % 20==0 
     return True 

settings.py:

'filters': { 
    'reduce_unreadable_post_errors' : { 
     '()' : 'path.to.your.ReduceUnreadablePostErrors' 
    }, 

    ... 

'handlers': { 
    'mail_admins': { 
     'level': 'ERROR', 
     'filters': ['require_debug_false','reduce_unreadable_post_errors'], 
     'class': 'common.utils.log.AdminEmailHandlerWithEmail' 
    }, 

    ... 
+2

很好的解決方案。使用過期的緩存鍵(60秒?我不知道什麼頻率)也可能是一個很好的解決方案。 – pztrick 2016-05-27 14:09:05

相關問題