Подтвердить что ты не робот

Django UnreadablePostError: ошибка чтения данных запроса

Я работаю над проектом django, и я получил это сообщение об ошибке.

Трассировка стека

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

Почему эта ошибка происходит?
Как решить?

4b9b3361

Ответ 1

Почему эта ошибка происходит?

потому что сервер получает неверный запрос, который может произойти по многим причинам. кто-то, возможно, отменил загрузку страницы, у кого-то может быть дрянное подключение к интернету, которое вырезано, космические лучи могли немного перевернуться.

Это не то, о чем вам действительно нужно беспокоиться, пока это не начнется очень часто. вы можете захотеть сделать заметку, когда произойдут эти ошибки, и посмотрите, будет ли она на той же странице или нет.

Как решить?

вы не можете. не по крайней мере в этот момент. собрать еще несколько данных о том, когда эта ошибка происходит точно. посмотрите, можете ли вы найти способ его запуска вручную.

Ответ 2

С помощью приложения в масштабе вы всегда будете получать случайный аннулированный запрос. Если вы получаете 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'
     },

     ...