django UnreadablePostError:请求数据读取错误

时间:2013-03-21 09:51:20

标签: 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

为什么会发生这种错误?
如何解决?

3 个答案:

答案 0 :(得分:16)

  

为什么会出现这种错误?

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

这不是你真正需要担心的事情,直到它经常发生。你可能想在这些错误发生时做一个记录,看看它是否在同一页面上。

  

如何解决?

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

答案 1 :(得分:9)

通过大规模应用,您将始终获得偶尔取消的请求。如果您收到500封电子邮件,则可能会非常繁琐。

我不建议完全无视它们。如果UnreadablePostErrors涌入,则出现问题,例如:较长的响应时间会导致用户取消请求。

我的解决方案是忽略1/20 UnreadablePostErrors。这样一来,如果出现问题,我仍然会被告知,但我会被纠缠20倍。它有点脏,但它对我有用。

"(?:[^"\\]|\\.)*"

settings.py:

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

答案 2 :(得分:0)

我为此写了节制版。如果出现尖峰,您将希望看到该错误,但是如果每隔五分钟出现一次,则可以忽略它。假设如果在一分钟内两次出现该问题,那么您可能会遇到一些问题。

def skip_unreadable_post(record):
    if record.exc_info:
        exc_value = record.exc_info[1]
        if isinstance(exc_value, UnreadablePostError):
            cache_key = "settings.unreadable_post_error"
            r = make_redis_interface("CACHE")
            if r.get(cache_key) is not None:
                # We've seen this recently; let it through; hitting it a lot
                # might mean something.
                return True
            else:
                # Haven't seen this recently; cache it with a minute expiry,
                # and don't let it through.
                r.set(cache_key, "True", ex=60)
                return False
    return True

...
    "filters": {
        "skip_unreadable_posts": {
            "()": "django.utils.log.CallbackFilter",
            "callback": skip_unreadable_post,
        },
    },
...
        "django.server": {
            "level": "INFO",
            "class": "logging.StreamHandler",
            "formatter": "django.server",
            "filters": ["skip_unreadable_posts"],
        },