首页 > 其他 > 详细

Flask源码之:路由加载

时间:2019-11-24 23:46:41      阅读:94      评论:0      收藏:0      [点我收藏+]

路由加载整体思路:

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

 

 

 

Flask源码之:路由加载

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!