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中去了.

原文地址:https://www.cnblogs.com/shengjunqiye/p/11924832.html