如何在Django中正确处理中止的HTTP请求

时间:2011-08-14 11:57:05

标签: django

每当客户端中止冗长的HTTP请求时(例如,浏览器关闭),Django视图似乎都会引发IOError异常。

如果我只是想忽略它们,检测这种中止请求的正确方法是什么?只是捕获IOError似乎太宽了......可能会意外忽略其他IO问题。

4 个答案:

答案 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