当process_request发生错误时,django中的中间件执行顺序是什么?

时间:2018-03-19 14:46:43

标签: python django django-middleware chain-of-responsibility request-response

我正在研究django中间件代码库。我查看了下面的图enter image description here

因此,图表非常清楚。

但我有一些问题

  1. 当process_request()中间件出现异常时会发生什么?怎么处理?是否会调用response_middleware?例如。如果process_view()的{​​{1}}出现异常,那么AuthenticationMiddleware的{​​{1}}会被调用吗?

  2. 在process_response()中间件返回响应时会发生什么?例如。如果process_response()的{​​{1}}返回响应,那么MessageMiddleware的{​​{1}}会被调用吗?或者它会从process_view()返回(即,它会调用AuthenticationMiddleware的{​​{1}},但不会调用process_response() MessageMiddleware

  3. 我已经在1.10中调试了django的行为,其中使用了新的中间件类,但我不熟悉旧的AuthenticationMiddleware设置?

    对于django 1.10: - 1)如果process_response() AuthenticationMiddleware返回响应,则会调用process_response()MessageMiddleware,如下图所示,适用于所有中间件。

    2)如果MIDDLEWARE_CLASSES process_request()引发异常,那么行为也会相同。

    纠正我,如果我错了。

    先谢谢。

2 个答案:

答案 0 :(得分:1)

如果您在版本1.10之前的django项目上工作,

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