我在Django中创建了自己的中间件类,直到最近才开始工作。奇怪的是,process_request仍然被调用得很好,但即使响应为500 - 内部服务器错误,也根本不调用process_exception。为什么呢?
我是否将中间件类声明为设置文件中已安装中间件列表中的第一个或最后一个条目没有区别。
谢谢, 戴夫
答案 0 :(得分:7)
process_exception
only gets invoked when the view raises an Exception
。如评论中所述
如果视图引发异常,则通过异常中间件运行它,
如果异常中间件返回响应,请使用它 否则,再加上例外。
错误配置,导入错误,process_request
和process_view
引发的异常无法捕获并提供给process_exception
处理程序。
要测试您的process_exception
是否有效,请在确保其正常运行后在视图中引发异常。
process_request
和process_exception
之间没有直接关系,它们是用于不同目的的处理程序,并在不同阶段被调用。在process_request
成功执行之后且在视图之前,process_exception
将不会被{{1}}捕获并处理。
答案 1 :(得分:2)
根据文档process_exception,
process_exception(self, request, exception)
获取一个HttpRequest对象,一个由view函数引发的Exception对象作为参数,并返回一个HttpResponseobject作为response.So,当代码引发500错误(一个HttpResponse对象)时,它不会被调用。将调用process_exception仅适用于视图中未被捕获的异常。