源码解析
1.刚开始会获取settings.py里配置的中间件 reversed反向
for middleware_path in reversed(settings.MIDDLEWARE):
2.process_view 添加到<视图中间件>列表前面 3.process_template_response 添加到<模板中间件>列表后面 4.process_exception 添加到<异常中间>件列表后面
if hasattr(mw_instance, "process_view"):
# 1. 中间件存在方法process_view, 添加到视图中间件列表前面
self._view_middleware.insert(
0,
self.adapt_method_mode(is_async, mw_instance.process_view),
)
if hasattr(mw_instance, "process_template_response"):
# 2. 中间件存在process_template_response则, 添加到模板中间件列表后面
self._template_response_middleware.append(
self.adapt_method_mode(
is_async, mw_instance.process_template_response
),
)
if hasattr(mw_instance, "process_exception"):
# The exception-handling stack is still always synchronous for
# now, so adapt that way.
# 3. 中间件方法存在process_exception 则插入到异常中间件列表后面
self._exception_middleware.append(
self.adapt_method_mode(
False, mw_instance.process_exception),
)
5.被当作参数传入时, 再触发__call__方法 - 5.1 现判断是否有process_request - 有则执行response = process_request(request) - 5.2 再判断是否有process_response - 有则执行response = process_response(request, response)
# 触发中间件的call方法 ,现执行response = process_request(request), 再执行response = process_response(request, response),
handler = convert_exception_to_response(mw_instance)
handler_is_async = middleware_is_async