[ Django中间件解析 ]


源码解析

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