Django中间件之加载分析

1.入口:wsgi.py

 

 2.WSGIHandler类   实例化调用__init__方法

3.父类 BaseHandler 中的 load_middleware()方法

 

 4.判断settings中MIDDLEWARE是否为空  一般我们的中间件不为空 走else分支

 

 5.上图中 self._get_response

复制代码
 # django/core/handlers/base.py
    def _get_response(self, request):
        response = None
        # 路由匹配
        if hasattr(request, 'urlconf'):
            urlconf = request.urlconf
            set_urlconf(urlconf)
            resolver = get_resolver(urlconf)
        else:
            resolver = get_resolver()
        resolver_match = resolver.resolve(request.path_info)
        # 这个callback就是我们的视图函数, 后两个是视图函数可能需要的参数
        callback, callback_args, callback_kwargs = resolver_match
        request.resolver_match = resolver_match

        # 应用 view middleware 中间件
        for middleware_method in self._view_middleware:
            response = middleware_method(request, callback, callback_args, callback_kwargs)
            # 只要有response返回, 就立刻停止遍历
            if response:
                break

        if response is None:
            # 给视图函数包装一层
            wrapped_callback = self.make_view_atomic(callback)
            try:
                # 这里是调用视图函数
                response = wrapped_callback(request, *callback_args, **callback_kwargs)
            except Exception as e:
                # 有异常就进入exception view处理
                response = self.process_exception_by_middleware(e, request)
                
        # 这个不常用的process_template_response功能, 看源码可以清楚的知道为什么
        # 返回的结果为啥需要有render方法了
        elif hasattr(response, 'render') and callable(response.render):
            for middleware_method in self._template_response_middleware:
                response = middleware_method(request, response)
                #  ...
            try:
                response = response.render()
            except Exception as e:
                response = self.process_exception_by_middleware(e, request)
        return response
复制代码
posted @   s686编程传  阅读(372)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示