我在 Django 中创建了我自己的中间件类,直到最近它都运行良好。奇怪的是 process_request 仍然被调用得很好,但是即使响应是 500 - internal server error,process_exception 也根本没有被调用。为什么?
我是否将我的中间件类声明为设置文件中已安装中间件列表中的第一个或最后一个条目没有区别。
谢谢,戴夫
我在 Django 中创建了我自己的中间件类,直到最近它都运行良好。奇怪的是 process_request 仍然被调用得很好,但是即使响应是 500 - internal server error,process_exception 也根本没有被调用。为什么?
我是否将我的中间件类声明为设置文件中已安装中间件列表中的第一个或最后一个条目没有区别。
谢谢,戴夫
process_exception
唯一在视图Exception
引发. 正如评论中所说
如果视图引发异常,则通过异常中间件运行它,
如果异常中间件返回响应,则使用它。
否则,重新引发异常。
由错误配置、导入错误引发的异常,process_request
并且process_view
无法被捕获并提供给process_exception
处理程序。
要测试您的process_exception
工作是否正常,请在确保其正常工作后在视图中引发异常。
process_request
和之间没有直接关系process_exception
,它们是用于不同目的的处理程序,并在不同阶段被调用。在成功执行之后和视图之前引发的任何异常process_request
都不会被如上所述捕获和处理process_exception
。
根据文档 process_exception,
process_exception(self, request, exception)
接受一个 HttpRequest 对象,一个由视图函数引发的异常对象作为参数,并返回一个 HttpResponse 对象作为响应。因此,当代码引发 500 错误(一个 HttpResponse 对象)时,它不会被调用。process_exception 只会在未捕获的情况下被调用视图中的异常。