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包装就可以添加了。

原文地址:https://www.cnblogs.com/fuzzier/p/7489121.html