当我们运行项目后,Flask内部都经历了什么

1、app.run()启动项目,ctrl点进源码

  

app.py:   

  1)执行了run_simple()

  

  2)注意第三个参数,这里是Flask实例化的对象,在这里会执行Flask的__call__()方法:

  

  3)调用wsgi_app()方法,再调用requet_context():

  

  4)实例化了一个RequestContext对象  

  

ctx.py:

  5)RequestContext初始化时,1处调用 app.create_url_adapter 方法,把 app 的 url_map 绑定到 WSGI environ 变量上。

  

  

  6)之后在__init__里又调用了match_request()

  

  7)这个方法调用了 url_adapter.match 方法,进行实际的匹配工作,返回匹配的 url_rule。

  

  8)回到4那里,我们知道了requet_context()返回的就是create_url_adapter 处理后的environ变量,并封装到RequestContext里,接下来,创建请求上下文,并调用了app.push()方法把它压栈:

  ,这里调用了_request_ctx_stack的push方法,而_request_ctx_stack是:

  

  9)_request_ctx_stack是LocalStack类的对象,在实例初始化时,又实例化了一个Local()对象

  

  10)Local对象初始化时,设置了__storage__和__ident_func__两个属性,这两个属性前者是存储封装后的request请求的,后者是给该请求添加唯一标识的。

  

  11)回到8,_request_ctx_stack.push(self)就是调用了LocalStack里的push方法,并将RequestContext的实例对象传了过去,然后添加进了一个空列表

  

  到此,app.push()的操作已完成

  12)继续往后看,调用了full_dispatch_request():

  

  13)这个函数是处理请求的开始地方,最核心的内容是 dispatch_request,加上处理请求的 hooks 和错误处理的内容。self.dispatch_request() 返回的是处理函数的返回结果(比如 hello world 例子中返回的字符串),finalize_request 会把它转换成 Response 对象。

   

  14)在 dispatch_request 之前我们看到 preprocess_request,之后看到 finalize_request,它们里面包括了请求处理之前和处理之后的很多 hooks 。这些 hooks 包括:

  • 第一次请求处理之前的 hook 函数,通过 before_first_request 定义,执行过程如下

    

    调用了self.try_trigger_before_first_request_functions()

    

  • 每个请求处理之前的 hook 函数,通过 before_request 定义

    

    调用了preprocess_request(),其中bp是使用蓝图后做的处理,暂不考虑使用蓝图的情况。

        

  • 每个请求正常处理之后的 hook 函数,通过 after_request 定义

    

    调用finalize_request(rv):

    

    调用了process_response(response),ctx是app.push()添加进去的请求对象的最后一个:

    

  • 不管请求是否异常都要执行的 teardown_request hook 函数,它是在整个请求完成,最后pop的过程中被执行的

    

    

    

    

    

  dispatch_request 要做的就是找到我们的处理函数,并返回调用的结果,也就是路由的过程

Flask应用运行流程的更多相关文章

  1. Django和Flask的区别以及运行流程

    Django: Python Web框架里比较有名当属Django,Django功能全面,它提供一站式解决方案,集成了MVT(Model-View-Template)和ORM,以及后台管理.但是缺点也 ...

  2. Flask应用启动流程

    目录 flask应用启动流程 WSGI 启动流程 flask应用启动流程 WSGI 所有的 python web 框架都要遵循 WSGI 协议 在这里还是要简单回顾一下 WSGI 的核心概念. WSG ...

  3. react-native start 运行流程

    在CMD下键入 C:\Node_JS\MyAwesomeProject>react-native start 运行流程: C:\Users\Grart\AppData\Roaming\npm\r ...

  4. 1、CC2541蓝牙4.0芯片中级教程——基于OSAL操作系统的运行流程了解+定时器和串口例程了解

    本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 ...

  5. java里的分支语句--程序运行流程的分类(顺序结构,分支结构,循环结构)

    JAVA里面的程序运行流程分三大类: 1,顺序结构:顺序结构就是依次执行每一行代码 2,分支结构:分支结构就是按不同的条件进行分支 3,循环结构:一段代码依条件进行循环执行. 其中,分支结构有两大类: ...

  6. servlet运行流程

    servlet运行流程  (2013-06-19 19:16:43) 转载▼     首先Servlet被部署到Web容器中,当客户端发送调用这个Servlet的请求到达Web容器时,Web容器会先判 ...

  7. [原创]java WEB学习笔记70:Struts2 学习之路-- struts2拦截器源码分析,运行流程

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  8. Struts2框架的运行流程

    Struts2的运行流程 1.浏览器发送请求到控制器(如Struts2中的核心控制器StrutsPrepareAndExecuteFilter): 2.控制器调用Action的execute方法: 3 ...

  9. 转:[gevent源码分析] 深度分析gevent运行流程

    [gevent源码分析] 深度分析gevent运行流程 http://blog.csdn.net/yueguanghaidao/article/details/24281751 一直对gevent运行 ...

随机推荐

  1. wx:for wx:for-items wx:for-item

    data:{ arr:[1,2,3,4,5], arrs:[[1,2,3,4,5],[1,2,3,4,5]] }wx:for 用于循环数组    默认数组的当前项的下标变量名默认为 index,数组当 ...

  2. Codeforces1107E Vasya and Binary String 记忆化dp

    Codeforces1107E 记忆化dp E. Vasya and Binary String Description: Vasya has a string \(s\) of length \(n ...

  3. python 之生产者消费者模型

    进程实现: import time,random from multiprocessing import Process,Queue def producer(name,q): count= 0 wh ...

  4. 启动Android模拟器问题集锦

    1.新建AVD时,报错“no CPU/ABI system image available for this target”, 解决:在SDK Manager中下载System Image 2.Sys ...

  5. 设置android设备时间与pc时间同步的批处理

    新建一个批处理文件 然后输入下面的内容: @echo off echo %date% echo %time% ,%%,%%,%.%,%%,%%,% //通过获取pc时间来设置android设备时间 a ...

  6. iOS 一次上传多张图片, 并返回进度值

    我封装的使用AFNetworking上传多图的一个方法.带进度条回调,希望对你用帮助,我app中亲测可用,不知道你的服务器是如何接收数据的: /** * 上传带图片的内容,允许多张图片上传(URL)P ...

  7. java读取properties文件的配置信息

    项目开发中,我们一般来向 application.properties 文件中放一些全局配置变量,以便程序中读取使用,本篇内容来演示从properties配置文件中读取键值. 当然,我们不一定写入 a ...

  8. CF888E Maximum Subsequence(meet in the middle)

    给一个数列和m,在数列任选若干个数,使得他们的和对m取模后最大( \(1<=n<=35\) , \(1<=m<=10^{9}\)) 考虑把数列分成两份,两边分别暴力求出所有的可 ...

  9. 利用idea创建一个基本的smm项目(带增删改查)

    环境  idea  jdk1.8  tomcat  mysql 打开idea选择创建一个maven项目 然后点击next,next,finsh 然后看项目的结构 如图所示 接着创建com包,再在com ...

  10. (转)关于MongoDB你需要知道的几件事

    本文列举了颇让作者困惑的一些MongoDB限制,如果你也打算使用MongoDB,那么至少要提前了解这些限制,以免遇到的时候措手不及. 消耗磁盘空间 这是我的第一个困惑:MongoDB会消耗太多的磁盘空 ...