无论何时,当客户端(例如浏览器关闭)中断一个长时间的HTTP请求时,Django视图似乎会引发IOError异常。
如果我只想忽略这些中止的请求,该如何正确地检测它们?仅捕获IOError似乎太广泛了,可能会意外地忽略其他IO问题。
如果我只想忽略这些中止的请求,该如何正确地检测它们?仅捕获IOError似乎太广泛了,可能会意外地忽略其他IO问题。
_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
UnreadablePostError
。(请参见此补丁。)skip_sentry
属性,因此您可以使用中间件在要忽略的错误上设置它:import sys
import traceback
class FilterPostErrorsMiddleware(object):
"""
A middleware that prevents unreadable POST errors to reach Sentry.
"""
def process_exception(self, request, exception):
if isinstance(exception, IOError):
tb = sys.exc_info()[2]
for _, _, function, _ in traceback.extract_tb(tb):
if function == '_get_raw_post_data':
exception.skip_sentry = True
break
注意:您必须使用最新版本的raven(例如1.8.4),因为早期版本错误地检查了异常类型上的skip_sentry
属性,而不是实例。
最好的方法是使用自定义中间件类来实现 process_exception()
方法,如果捕获到 IOException
,则返回一个自定义的HTTP响应,例如渲染 errors/request_aborted.html
模板。
如果你想忽略 IOError
,那就让它存在。你不需要捕获它。如果你非常必须要捕获它,你可以像 @Filip Dupanović 建议的那样,可能返回一个 django.http.HttpResponseServerError
来将响应代码设置为 500
。