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