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中去了.
Flask源码之:路由加载的更多相关文章
- flask 源码专题(八):路由加载
1.示例代码 from flask import Flask app = Flask(__name__,static_url_path='/xx') @app.route('/index') def ...
- 06 flask源码剖析之路由加载
06 Flask源码之:路由加载 目录 06 Flask源码之:路由加载 1.示例代码 2.路由加载源码分析 1.示例代码 from flask import Flask app = Flask(__ ...
- 05 flask源码剖析之配置加载
05 Flask源码之:配置加载 目录 05 Flask源码之:配置加载 1.加载配置文件 2.app.config源码分析 3.from_object源码分析 4. 总结 1.加载配置文件 from ...
- flask源码系列
更新中 HTML文档中元素存在,但是在浏览器中不显示.一般用于配合JavaScript代码使用. 04 LocalStack和Local对象实现栈的管理 05 Flask源码之:配置加载 06 Fla ...
- flask源码剖析系列(系列目录)
flask源码剖析系列(系列目录) 01 flask源码剖析之werkzurg 了解wsgi 02 flask源码剖析之flask快速使用 03 flask源码剖析之threading.local和高 ...
- Flask源码流程分析(一)
Flask源码流程分析: 1.项目启动: 1.实例化Flask对象 1. 重要的加载项: * url_rule_class = Rule * url_map_class = Map * session ...
- flask 源码专题(二):请求上下文与全文上下文
源码解析 0. 请求入口 if __name__ == '__main__': app.run() def run(self, host=None, port=None, debug=None, lo ...
- flask源码分析
本flask源码分析不间断更新 而且我分析的源码全是我个人觉得是很beautiful的 1 flask-login 1.1 flask.ext.login.login_required(func),下 ...
- Flask源码学习—config配置管理
自己用Flask做了一个博客(www.hbnnlove.sinaapp.com),之前苦于没有对源码解析的文档,只能自己硬着头皮看.现在我把我自己学习Flask源码的收获写出来,也希望能给后续要学习F ...
随机推荐
- [RN] React Native 使用精美图标库react-native-vector-icons
React Native 使用精美图标库react-native-vector-icons 一.安装依赖 npm install --save react-native-vector-icons // ...
- on bind live delegate的区别
bind()----直接绑定在元素上 live()----通过冒泡的方式绑定到元素上,更适合于列表类型的绑定,和bind()相比,支持动态数据 delegate()----精确的小范围的适用事件代理, ...
- request登录案例
一.案例需求 1.编写login.html登录页面 username & password 两个输入框 2.使用Druid数据库连接池技术,操作mysql,day14数据库中user表 3.使 ...
- 2019 第二届 科成安洵杯 官方WriteUp -17网安
长文预警:对应源码请加企鹅群获取:861677907 0x01 WEB 1.1 勇闯贪吃蛇大冒险 一进去就看出来是一道web页面JS的小游戏,提示说输入CDUESTC CTF即可闯关成功,但是存在着d ...
- vi编辑器操作 快捷键
vi编辑器操作 快捷键 1. 命令模式 与 编辑模式切换 a:光标向后移动一位进入编辑模式 i:光标和内容 没有变化进入编辑模式 o:新起一行进入编辑模式 s:删除光标所在字符进入编辑模式 ...
- 使用Alibaba的Nacos做为SpringCloud的注册和配置中心,并结合Sentinel+Nocos动态进行限流熔断
最近在学习阿里的Nacos组件以及Sentinel组件,折腾出了一个小demo. Git地址:https://github.com/yangzhilong/nacos-client 有兴趣的小伙伴可以 ...
- kotlin基础 range
a = 1..10 //[1,10] b = 1 unitl 10 //[1,10)
- EV录屏 --- 免费无水印,集视频录制与直播功能于一身的桌面录屏软件, 支持录屏涂鸦、实时按键显示、视频体积压缩等实用功能
https://www.ieway.cn/index.html 免费无水印,集视频录制与直播功能于一身的桌面录屏软件,支持录屏涂鸦.实时按键显示.视频体积压缩等实用功能 EVCapture 3.9.7 ...
- mark_Linux_wc
Linux wc命令 Linux wc命令用于计算字数. 利用wc指令我们可以计算文件的Byte数.字数.或是列数,若不指定文件名称.或是所给予的文件名为"-",则wc指令会从标准 ...
- Operation之其他实用操作符
delay 该操作符会将 Observable 的所有元素都先拖延一段设定好的时间, 然后才将他们发送出来 Observable.of(1,2,3,4) .delay(5, scheduler: Ma ...