2013-03-21 2 views
13

Pracuję nad projektem django i otrzymałem ten komunikat o błędzie.django UnreadablePostError: request data read error

Ślad stosu

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 

Dlaczego ten błąd się dzieje?
Jak rozwiązać?

+10

Są połamane wnioski. Na przykład. ktoś anulował prośbę, publikując coś. możesz je zignorować. Ale może chcesz sprawdzić, na której stronie to się dzieje. Może twoja aplikacja zabiera zbyt dużo czasu, aby coś załadować. –

+4

@Bibhas Kiedyś pracowałem z najstraszliwszymi QA, których idea "testów warunków skrajnych" trzymała "F5" w przeglądarce. Wielu z nich wyskoczyło. :) – dmg

+0

: D Ludzie i ich zwariowana logika. : P BTW, czy powinienem zamieścić ten komentarz jako odpowiedź? Tak naprawdę jednak nie można tego rozwiązać. Nie wiem też, jak radzisz sobie ze złamanymi prośbami. –

Odpowiedz

11

Why this error is happening ?

ponieważ serwer jest już otrzymywać nieprawidłowy wniosek, co może się zdarzyć z wielu powodów. Ktoś mógł anulować ładowanie strony, ktoś może mieć zgniłe połączenie z Internetem, które wyłączyło, promieniowanie kosmiczne mogło odwrócić nieco.

to nie jest coś, na co naprawdę trzeba się martwić, dopóki nie zacznie się zdarzać bardzo często. możesz chcieć zanotować, kiedy te błędy się zdarzą i zobaczyć, czy w konsekwencji jest na tej samej stronie, czy nie.

How to solve?

Nie możesz. nie w tym momencie przynajmniej. zebrać więcej danych o tym, kiedy dokładnie wystąpi ten błąd. Sprawdź, czy możesz znaleźć sposób na wyzwolenie go ręcznie.

3

Dzięki aplikacji na dużą skalę zawsze otrzymujesz sporadycznie anulowaną prośbę. Jeśli otrzymujesz 500 e-maili, mogą one być dość uciążliwe.

Nie radzę całkowicie ich ignorować. Jeśli pojawiają się dane UnreadablePostErrors, oznacza to, że coś jest nie tak, np. dłuższy czas reakcji powoduje, że użytkownicy anulują żądania.

Moim rozwiązaniem było zignorowanie 1/20 UnreadablePostErrors. W ten sposób, jeśli coś pójdzie nie tak, będę nadal informowany, ale będę obciążony 20 razy mniej. To trochę brudne, ale zadziałało to dla mnie.

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

Ładne rozwiązanie. Używanie wygasającego klucza pamięci podręcznej (60 sekund? Nie wiem, jaka częstotliwość) mogłoby również być dobrym rozwiązaniem. – pztrick