zoukankan      html  css  js  c++  java
  • 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
    万般皆下品,唯有读书高!
  • 相关阅读:
    Java网络编程
    loj#6517. 「雅礼集训 2018 Day11」字符串(回滚莫队)
    bzoj4241: 历史研究(回滚莫队)
    洛谷P5050 【模板】多项式多点求值
    loj#6053. 简单的函数(Min_25筛)
    【BZOJ4144】[AMPPZ2014]Petrol(最短路+最小生成树+并查集)
    51nod 1781 Pinball(线段树)
    CF1110D Jongmah
    CF1106F Lunar New Year and a Recursive Sequence(矩阵快速幂+bsgs+exgcd)
    20. Valid Parentheses
  • 原文地址:https://www.cnblogs.com/s686zhou/p/12129800.html
Copyright © 2011-2022 走看看