当我们运行项目后,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. Request.UrlReferrer 实现页面刷新

    在使用Ajax 异步提交表单的时候,需要返回某些状态信息.但如果把需要返回的如分页.过滤的参数写在控制器的参数里面,会比较繁琐. 因此,1.可以在控制器里面使用 Request 对象的请求的URL. ...

  2. 解决 'chromedriver' executable needs to be in PATH.'报错

    试了把chromedriver.exe放到chrome安装文件下,python安装文件下,然后把路径配到path里,均无用. 最后是修改函数调用得以解决: from selenium import w ...

  3. Tomcat注入到系统服务中,实现服务自启动及常驻

    步骤一.打开service.bat 并修改(推荐notepad++):  1.set SERVICE_NAME=Tomcat6(服务名称,可在命令行中通过该名字进行服务的控制(启动/关闭)) 2.se ...

  4. SmartSql使用教程(1)——初探,建立一个简单的CURD接口服务

    一.引言 最近SmartSql被正式引入到了NCC,借着这个契机写一个使用教程系列 二.SmartSql简介[摘自官方文档] 1. SmartSql是什么? SmartSql = MyBatis + ...

  5. js 调用栈机制与ES6尾调用优化介绍

    调用栈的英文名叫做Call Stack,大家或多或少是有听过的,但是对于js调用栈的工作方式以及如何在工作中利用这一特性,大部分人可能没有进行过更深入的研究,这块内容可以说对我们前端来说就是所谓的基础 ...

  6. HDU - 1098 - Ignatius's puzzle - ax+by=c

    http://acm.hdu.edu.cn/showproblem.php?pid=1098 其实一开始猜测只要验证x=1的时候就行了,但是不知道怎么证明. 题解表示用数学归纳法,假设f(x)成立,证 ...

  7. 洛谷 - P2051 - 中国象棋 - 简单dp

    https://www.luogu.org/problemnew/show/P2051 一点都不简单的简单dp. 还是从旧行转移到新行,而不是考虑新行从哪些旧行转移吧. #include<bit ...

  8. hadoop 2.5.1单机安装部署伪集群

    环境:ubuntu 14.04 server 64版本 hadoop 2.5.1 jdk 1.6 部署的步骤主要参考了http://blog.csdn.net/greensurfer/article/ ...

  9. 跳跃表&hash

    汇编刚学跳跃表,发现跳跃表与hash有着数不清的关系 维基百科: 哈希表(哈希映射)是实现关联数组抽象数据类型的数据结构,该结构可以将键映射到值.哈希表使用哈希函数来计算桶或槽阵列的索引,从中可以找到 ...

  10. C 语言实例 - 将字符串写入文件

    C 语言实例 - 将字符串写入文件 C 语言实例 C 语言实例 将字符串写入文件. 实例 #include <stdio.h> #include <stdlib.h> /* e ...