[ django自动事务源码解析 ]


1.启动django的时候

class WSGIHandler(base.BaseHandler):
    request_class = WSGIRequest

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.load_middleware() #加载中间件

1

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) 2

三. 然后执行了__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方法