django UnreadablePostError:请求数据读取错误

Bat*_*ren 17 python django mod-wsgi

我正在研究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
Run Code Online (Sandbox Code Playgroud)

为什么会出现这种错误?
怎么解决?

dox*_*xin 17

为什么会出现这种错误?

因为服务器正在收到格式错误的请求,这可能由于多种原因而发生.有人可能已经取消加载页面,有人可能有一个蹩脚的互联网连接切断,宇宙射线可能有点翻转.

这不是你真正需要担心的事情,直到它经常发生.您可能希望在发生这些错误时记下这些错误并查看它是否在同一页面上.

怎么解决?

你不能.至少在这一点上.收集更多关于何时发生此错误的数据.看看你是否能找到一种手动触发它的方法.


Dea*_*ean 9

通过大规模应用,您将始终获得偶尔取消的请求.如果您收到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
Run Code Online (Sandbox Code Playgroud)

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'
     },

     ...
Run Code Online (Sandbox Code Playgroud)

  • 好的解决方案 使用过期的缓存密钥(60秒?我不知道什么频率.)也可能是一个很好的解决方案. (3认同)