Flask源码之:路由加载
路由加载整体思路:
1. 将 url = /index 和 methods = [GET,POST] 和 endpoint = "index"封装到Rule对象
2. 将Rule对象添加到 app.url_map中。
url_rule_class = Rule
self.url_map = self.url_map_class()
3. 把endpoint和函数的对应关系放到 app.view_functions中。
self.view_functions = {}
在add_url_rule中有:
self.view_functions[endpoint] = view_func
看源码:
手写项目启动: from flask import Flask app = Flask(__name__,static_url_path='/xx') @app.route('/index') def index(): return 'hello world' if __name__ == '__main__': app.run()
点击route进入源码
route函数整体是个闭包
点击add_url_rule,里面传了很多参数,self是app,rule是'/index'这个路径字符串,endpoint默认就是函数的别名'index',f就是函数名index
options["endpoint"] = endpoint将endpoint作为值放到options的字典里面去了,
再点_endpoint_from_view_func
返回就是个函数名,所以endpoint不写时默认就是你传进来的函数名
再回到add_url_rule
再往下找,rule = self.url_rule_class(rule, methods=methods, **options)就把rule(路径),methods支持请求方式,这里的option就是刚才传进去的endpoint(函数别名)都给传进去了
再点url_rule_class进去
所以,前面的rule就是Rule的一个对象,并把三个参数给封装了进去
再点Rule进去
刚才传的路径给了string,methods放到了methods(GET,POST之类的),endpoint放的是函数别名(字符串)
再回到add_url_rule
往下走,self.url_map.add(rule),你点url_map进去之后会发现他是个Map的对象,就把rule添加到了Map对象中了
再往下看,view_func是真正的函数名,函数名被放到了一个字典中.
这样,flask路由的加载就走完了
所有的内容全部都加到了app中去了.