1.启动django的时候
class WSGIHandler(base.BaseHandler):
request_class = WSGIRequest
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.load_middleware() #加载中间件

2.发起请求的时候
一. 应该是WSGI服务-> 他调用了application(xxx,xxx)触发了call方法
import os
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_test.settings')
application = get_asgi_application()
二.执行了这个self.get_response(request)

三. 然后执行了__middleware_chain方法
def get_response(self, request):
"""Return an HttpResponse object for the given HttpRequest."""
# Setup default url resolver for this thread
set_urlconf(settings.ROOT_URLCONF)
response = self._middleware_chain(request)
四._middleware_chain已经绑定到 self._get_response并且已经套了middleware但是还没有call触发
他的执行内容就是
- 获取拿到接口的view的函数,
- 请求中间件
- 检查添加自动事务
- 执行view
- 如果异常执行异常中间件
- 响应中间件
class BaseHandler:
。。。
_middleware_chain = None
def load_middleware(self, is_async=False):
。。。
self._exception_middleware = []
get_response = self._get_response_async if is_async else self._get_response
handler = convert_exception_to_response(get_response)
handler_is_async = is_async
for middleware_path in reversed(settings.MIDDLEWARE):
middleware = import_string(middleware_path)
middleware_can_sync = getattr(middleware, "sync_capable", True)
middleware_can_async = getattr(middleware, "async_capable", False)
。。。
。。。
。。。
self._middleware_chain = handler
self._get_response方法
