zoukankan      html  css  js  c++  java
  • flask0.1版源码浅析——url分配处理

    1 application 启动(匹配路由)

    1.1 首先我们需要了解wsgi的概念:

    每个 python web 应用都是一个可调用(callable)的对象。在 flask 中,这个对象就是 app=Flask(__name__) 创建出来的app,也就是 Application 部分。要运行 web 应用,必须有 web server,比如像服务器有的 apache、nginx 。

    1.2 server和app之间通过 app(environ, start_response)进行通信,

    1.3 正式启动 app.run()

      ---> run_simple(...,self,...)

         ---> Flask()的__call__  

          ---> wsgi_app(environ, start_response)

            ----> dispatch_request

    1.3.1 然后我们来看一下dispath_request 方法match路由

        def dispatch_request(self):
            # ...
            try:
                endpoint, values = self.match_request()
                return self.view_functions[endpoint](**values)
           except:
              # 异常处理
                pass

    这个方法主要进行了请求匹配,match出相应的view_function,返回这个view_function

    1.3.2 所以接下来我们看一下match_request方法

        def match_request(self):
            rv = _request_ctx_stack.top.url_adapter.match()
            request.endpoint, request.view_args = rv
            return rv

    这个方法是先从_request_ctx_stack总取出相应了request_context,然后根据自定义容器Map找到对应的url的endpoint和相关参数,最后返回。

    2 路由(注册路由)

    2.1 首先我们通过 app.route(self, rule, **options) 可知

    def route(self, rule, **options):
        # ...
        def decorator(f):
            self.add_url_rule(rule, f.__name__, **options)
            self.view_functions[f.__name__] = f
            return f
        return decorator

    2.1.1 这个方法运用了装饰器,所以flask的应用会很简洁。

    并且他的这个装饰器和常见的装饰器定义有所不同,他是对象调用方法的方式创建装饰器.

    self.route(decortate(f))

    首先会进行路由注册,然后返回自身的这个view_function

    我们在看里面调用的方法

    2.1.2  add_url_rule(self, rule, endpoint=None, view_func=None, **options)  来进行注册路由

        def add_url_rule(self, rule, endpoint, **options):
            options['endpoint'] = endpoint
            options.setdefault('methods', ('GET',))
            self.url_map.add(Rule(rule, **options))

    这个方法就是向url_map中添加路由, 默认的endpoint就是传入的func.__name__; 然后默认的methods就是‘GET', 最后进行一次Rule包装就可以添加了。

  • 相关阅读:
    【Luogu1501】Tree(Link-Cut Tree)
    【BZOJ3530】数数(AC自动机,动态规划)
    【BZOJ1212】L语言(AC自动机)
    【BZOJ2037】Sue的小球(动态规划)
    【BZOJ1899】午餐(动态规划)
    【BZOJ1009】GT考试(KMP算法,矩阵快速幂,动态规划)
    【BZOJ1040】骑士(动态规划)
    【BZOJ1969】航线规划(Link-Cut Tree)
    【BZOJ4653】【NOI2016】区间(线段树)
    我也不知道什么是"莫比乌斯反演"和"杜教筛"
  • 原文地址:https://www.cnblogs.com/fuzzier/p/7489121.html
Copyright © 2011-2022 走看看