因此,图表非常清楚。
但我有一些问题
当process_request()中间件出现异常时会发生什么?怎么处理?是否会调用response_middleware?例如。如果process_view()
的{{1}}出现异常,那么AuthenticationMiddleware
的{{1}}会被调用吗?
在process_response()中间件返回响应时会发生什么?例如。如果process_response()
的{{1}}返回响应,那么MessageMiddleware
的{{1}}会被调用吗?或者它会从process_view()
返回(即,它会调用AuthenticationMiddleware
的{{1}},但不会调用process_response()
MessageMiddleware
)
我已经在1.10中调试了django的行为,其中使用了新的中间件类,但我不熟悉旧的AuthenticationMiddleware
设置?
对于django 1.10: -
1)如果process_response()
AuthenticationMiddleware
返回响应,则会调用process_response()
和MessageMiddleware
,如下图所示,适用于所有中间件。
2)如果MIDDLEWARE_CLASSES
process_request()
引发异常,那么行为也会相同。
纠正我,如果我错了。
先谢谢。
答案 0 :(得分:1)
The official documentation可以回答您的第一个问题。
请阅读以下段落:使用MIDDLEWARE和MIDDLEWARE_CLASSES之间的行为差异
在MIDDLEWARE_CLASSES下,每个中间件都将始终调用其process_response方法,即使较早的中间件通过从其process_request方法返回响应而短路。在MIDDLEWARE下,中间件的行为更像一个洋葱:响应在输出过程中经过的层与看到请求的层相同。如果中间件发生短路,则仅该中间件及其中的中间层短路。 MIDDLEWARE将看到响应。
但是自django v1.10起已删除MIDDLEWARE_CLASSES
,此后引入了新的中间件工作流样式(改用__call__()
),这允许每个中间件(在{{1}中应用) })在内部确定是否通过返回响应(具有错误状态)并且不调用后续中间件并在异常处理时查看中间件来进行短路,在这种情况下,问题中的图可能并非总是如此,特别是如果该项目包括自定义中间件。
[旁注],异常短路的中间件可能看起来像这样:
MIDDLEWARE
答案 1 :(得分:0)
对于2),您是对的。函数convert_exception_to_response()
将捕获process_request()
引发的异常。
参见来源:
https://github.com/django/django/blob/master/django/core/handlers/base.py
https://github.com/django/django/blob/master/django/core/handlers/exception.py