每当客户端中止冗长的HTTP请求时(例如,浏览器关闭),Django视图似乎都会引发IOError异常。
如果我只是想忽略它们,检测这种中止请求的正确方法是什么?只是捕获IOError似乎太宽了......可能会意外忽略其他IO问题。
答案 0 :(得分:2)
在django 1.3及更高版本中,您可以使用logging filter类来抑制您不感兴趣的异常。这是我用来简化抑制从{{1引发的IOError异常的日志记录过滤器类}}:
_get_raw_post_data()
在Django 1.4中,您将能够消除大部分复杂性并抑制新的异常类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
。 (见this patch)。
答案 1 :(得分:1)
最好的方法是使用实现process_exception()
的自定义中间件类来返回自定义HTTP响应,比如呈现errors/request_aborted.html
模板,如果发现IOException
答案 2 :(得分:1)
Raven现在将自己连接到got_request_exception()信号以捕获未处理的异常,完全绕过日志记录系统,因此dlowe提出的解决方案不再起作用。
然而,raven在异常实例上查找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
属性而不是实例。< / p>
答案 3 :(得分:0)
如果你想忽略IOError
,那就放手吧。你不需要抓住它。如果您绝对必须抓住它,您可以执行@FilipDupanović建议的操作,并可能返回django.http.HttpResponseServerError
将响应代码设置为500
。