解决Django中的IOError问题
我正在运行一个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
错误是因为客户端在不合适的时候断开连接造成的,这并不是我网站的问题。
如果真是这样的话:我能否以某种方式关闭这些错误的邮件通知?我真的不想知道那些我无法修复的错误,而且这些错误其实也不算真正的错误。
3 个回答
2
在Django 1.3及以上版本中,你可以使用一个叫做日志过滤器的类,来屏蔽那些你不想看到的错误信息。下面是我用来专门屏蔽从_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
在Django 1.4中,你将能够简化很多操作,直接屏蔽新的错误类UnreadablePostError
。(可以参考这个补丁)。
11
为了扩展@dlowe在Django 1.3中的解决方案,我们可以写出一个完整的示例:
settings.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,
},
}
}
common/logging.py
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
2
你可以写一个中间件来捕捉异常,然后你可以“静音”那些特定的异常。
https://docs.djangoproject.com/en/2.2/topics/http/middleware/