清除Django IOErrors

2024-04-29 10:49:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在运行一个Django站点(通过Apache/mod_python),我使用Django的工具来通知我和其他开发人员有关内部服务器错误的信息。有时会出现这样的错误:

Traceback (most recent call last):

  File "/opt/webapp/externals/lib/django/core/handlers/base.py", line 92, in get_response
    response = callback(request, *callback_args, **callback_kwargs)

  File "/opt/webapp/csite/apps/customers/views.py", line 29, in feedback
    form = FeedbackForm(request.POST)

  File "/opt/webapp/externals/lib/django/core/handlers/modpython.py", line 113, in _get_post
    self._load_post_and_files()

  File "/opt/webapp/externals/lib/django/core/handlers/modpython.py", line 96, in _load_post_and_files
    self._post, self._files = http.QueryDict(self.raw_post_data, encoding=self._encoding), datastructures.MultiValueDict()

  File "/opt/webapp/externals/lib/django/core/handlers/modpython.py", line 163, in _get_raw_post_data
    self._raw_post_data = self._req.read()

IOError: Client read error (Timeout?)

据我所知,这些IOError是由在错误时刻断开连接的客户端生成的,这不是我的网站的问题。在

如果是这样的话:我能为这些错误禁用电子邮件吗?我真的不想知道那些我不能修复的错误,也不是真正的错误。在


Tags: djangoinpycoreselfgetlibhandlers
3条回答

通过@dlowefordjango1.3扩展解决方案,我们可以将完整的工作示例写成:

在设置.py在

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'supress_unreadable_post': {
            '()': 'common.logging.SuppressUnreadablePost',
        }
    },
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
            'filters': ['supress_unreadable_post'],
        }
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
    }
}

普通/日志记录.py在

^{pr2}$

您应该能够编写一个中间件来捕获异常,然后可以“沉默”这些特定的异常。在

https://docs.djangoproject.com/en/2.2/topics/http/middleware/

在django1.3及更高版本中,可以使用logging filter类来抑制您不感兴趣的异常。下面是我使用的日志过滤器类,用于严格禁止从_get_raw_post_data()引发的IOError异常:

import sys, traceback
class _SuppressUnreadablePost(object):
    def filter(self, record):
        _, exception, tb = sys.exc_info()
        if isinstance(exception, IOError):
            for _, _, function, _ in traceback.extract_tb(tb):
                if function == '_get_raw_post_data':
                    return False
        return True

在django1.4中,您将能够消除大部分的复杂性并抑制新的异常类UnreadablePostError。(见this patch)。在

相关问题 更多 >