23

我正在处理 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

为什么会发生此错误?
怎么解决?

4

3 回答 3

18

为什么会发生此错误?

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

在它开始频繁发生之前,您真的不需要担心。当这些错误发生时,您可能需要记下并查看它是否因此在同一页面上。

怎么解决?

你不能。至少现在不是。收集更多有关此错误何时发生的数据。看看您是否可以找到手动触发它的方法。

于 2015-02-19T03:57:23.147 回答
14

使用大规模应用程序,您总是会偶尔收到取消的请求。如果您收到 500 封电子邮件,它们可能会非常乏味。

我不建议完全忽略它们。如果 UnreadablePostErrors 大量涌入,则说明有问题,例如较长的响应时间会导致用户取消请求。

我的解决方案是管理员电子邮件的自定义过滤器,您可以在其中放置您想要的任何逻辑。

最简单的可能是随机忽略 20 个 UnreadablePostErrors 中的 19 个。这样,如果出现问题,我仍然会被告知,但我会少 20 倍地被纠缠。

如果您想要更花哨的东西,我会选择@pztrick 的解决方案。

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

设置.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'
     },

     ...
于 2016-04-18T05:31:09.650 回答
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"],
        },
于 2020-06-10T23:21:16.573 回答