![782f9eac6804312d6e0f41d6cdc31312.png](https://i-blog.csdnimg.cn/blog_migrate/749bd443caf59319f2bc819c04af6372.jpeg)
一次完整的请求
在我们了解Flask运行流程之前,先看一下我们在浏览器一次请求中所经历的过程,下面这张是结合Flask的源码绘制的一张流程图
![c65f2b20ab0a23f2e17014ebfd9ac64c.png](https://i-blog.csdnimg.cn/blog_migrate/331e3d47eea7246bcffdde6208068272.jpeg)
能看到Flask在一次请求中实际上只是做了最后一部分功能,这里没有将Flask的具体处理流程列出来,我们在下面会继续讲解。 在上图中出现WSGIRequestHandler,WSGI协议是在Python Web开发中很核心的部分,如果想继续进击的话,需要对这部分有深刻的理解。 这部分我在另一篇文章中有写到,如有需要可以查看
战渣渣:WEB开发——Python WSGI协议详解zhuanlan.zhihu.com![802e0a0bbbc288bddc1df68efd944766.png](https://i-blog.csdnimg.cn/blog_migrate/20c8e8206edaac38879f3c0b52033914.jpeg)
Flask处理流程
我所理解Flask要做的事情,是根据请求的HTTP协议中url和method映射相应的处理函数,处理完并返回。这是基础的功能,Flask在这基础上又增加了一些其他功能。下面我们就通过Flask的源码中一些属性来进行分析。
Flask部分重要属性
![fcb5b62cceea069366b175f0369eb9c6.png](https://i-blog.csdnimg.cn/blog_migrate/c983b300ac858e4328037bfd8f45d997.jpeg)
![3f64ea9c06a9cc907f697c1200da0cee.png](https://i-blog.csdnimg.cn/blog_migrate/6e06b728d61bd6e1187c72ccd4e9a427.jpeg)
Flask在启动时已将各属性根据需求配置好,但实际映射函数的属性就是view_functions,此属性类型为字典,key是endpoint。
endpoint可自定义,若不指定将会根据函数名生成,若出现重复的endpoint将会提示错误。
endpoint会与url和method统一封装成到rule放入到url_map中,在请求过来时会根据url和和method生成reuqest到url_map中匹配,如果匹配到则根据endpoint获取到相应的函数去执行,并将结果返回。这部分可以看Flask源码部分。
添加到url_map
# flask/app.py
请求时匹配请求
- 生成请求
# flask/app.py
此处是在生成上下文的push中执行会执行match_request,这里没有贴出来。 实质就是请求过来了,根据url和method匹配启动时的url_map,如果没有的话则返回匹配不到
- 匹配请求
# flask/app.py
根据上面从url_map得到的rule,然后根据endpoint取得要执行的函数。
Flask另外几个属性,则表示在请求之前和请求之后做一些处理,并且可以针对不同的blueprints来进行处理,关于blueprints我们等几个章节再细分析。
Flask的处理流程
Flask实际的处理流程是什么样子,先看一下Flask的源码
# flask/app.py
基本流程可以看的比较清晰,至于每个函数列表的来源以及作用,我在开始的属性图上已将其标识出来。
![3c81e8540c029b2cc601fe6ad948ddf3.png](https://i-blog.csdnimg.cn/blog_migrate/26d8f939f1e0c28389fe550e6913b7a6.jpeg)
至此可以大体知道请求过来之后Flask是如何处理及前期Flask会构建哪些内容。
但Flask还有很多东西。例如我们经常使用request,current_app对象和常用的blueprints是怎么个原理。
下章节会针对Flask的上下文处理再做深入的理解。
加深交流联系看下方
![666646843c5e856df780e2b898033530.png](https://i-blog.csdnimg.cn/blog_migrate/c33e243e0168284533b0cd2943f7f97e.jpeg)