路由加载整体思路:

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源码之:路由加载的更多相关文章

  1. flask 源码专题(八):路由加载

    1.示例代码 from flask import Flask app = Flask(__name__,static_url_path='/xx') @app.route('/index') def ...

  2. 06 flask源码剖析之路由加载

    06 Flask源码之:路由加载 目录 06 Flask源码之:路由加载 1.示例代码 2.路由加载源码分析 1.示例代码 from flask import Flask app = Flask(__ ...

  3. 05 flask源码剖析之配置加载

    05 Flask源码之:配置加载 目录 05 Flask源码之:配置加载 1.加载配置文件 2.app.config源码分析 3.from_object源码分析 4. 总结 1.加载配置文件 from ...

  4. flask源码系列

    更新中 HTML文档中元素存在,但是在浏览器中不显示.一般用于配合JavaScript代码使用. 04 LocalStack和Local对象实现栈的管理 05 Flask源码之:配置加载 06 Fla ...

  5. flask源码剖析系列(系列目录)

    flask源码剖析系列(系列目录) 01 flask源码剖析之werkzurg 了解wsgi 02 flask源码剖析之flask快速使用 03 flask源码剖析之threading.local和高 ...

  6. Flask源码流程分析(一)

    Flask源码流程分析: 1.项目启动: 1.实例化Flask对象 1. 重要的加载项: * url_rule_class = Rule * url_map_class = Map * session ...

  7. flask 源码专题(二):请求上下文与全文上下文

    源码解析 0. 请求入口 if __name__ == '__main__': app.run() def run(self, host=None, port=None, debug=None, lo ...

  8. flask源码分析

    本flask源码分析不间断更新 而且我分析的源码全是我个人觉得是很beautiful的 1 flask-login 1.1 flask.ext.login.login_required(func),下 ...

  9. Flask源码学习—config配置管理

    自己用Flask做了一个博客(www.hbnnlove.sinaapp.com),之前苦于没有对源码解析的文档,只能自己硬着头皮看.现在我把我自己学习Flask源码的收获写出来,也希望能给后续要学习F ...

随机推荐

  1. Hibernate的批量查询——HQL

    HQL(Hibernate Query Language)查询: 1.查询所有学生信息: public static void testSel() { Session session = Hibern ...

  2. nightwatch 基于Webdriver的端到端自动化测试框架

    nightwatch 是使用nodejs编写的,基于Webdriver api 的端到端自动化测试框架 包含以下特性 清晰的语法,基于js 以及css 还有xpath 的选择器 内置测试runner, ...

  3. hive基础知识二

    1. Hive的分区表 1.1 hive的分区表的概念 在文件系统上建立文件夹,把表的数据放在不同文件夹下面,加快查询速度. 1.2 hive分区表的构建 创建一个分区字段的分区表 hive> ...

  4. 反素数 Antiprime(信息学奥赛一本通 1625)(洛谷 1463)

    题目描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6 ...

  5. 启动uiautomatorview 提示无法初始化主类

    启动uiautomatorview 提示无法初始化主类, 重新安装jdk到1.8版本就好了,就是这么神奇.

  6. 为什么 Redis 单线程能支撑高并发?

    阅读本文大概需要 4 分钟. 作者:Draveness 最近在看 UNIX 网络编程并研究了一下 Redis 的实现,感觉 Redis 的源代码十分适合阅读和分析,其中 I/O 多路复用(mutipl ...

  7. MySQL数据库索引的底层原理(二叉树、平衡二叉树、B-Tree、B+Tree)

    1.MySQL数据库索引的底层原理 https://mp.weixin.qq.com/s/zA9KvCkkte2mTWTcDv7hUg

  8. 【JavaScript】frame跨域访问元素

    什么是跨frame访问元素呢?比如main.html中有如下代码: <frameset cols="50%,*"> <frame src="frame1 ...

  9. Flutter Plugin开发简单示例

    新建Plugin项目: flutter create --template=plugin -i swift -a javahello lib/hello.dart: 插件包的Dart API. and ...

  10. 解决bootstrap-table表头filter-control select控件被遮挡显示不全的问题

    [本文出自天外归云的博客园] 在使用bootstrap-table的extension——filter-control时(对应表格的data-filter-control="true&quo ...