当我们运行项目后,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. Python批量操作Linux服务器执行命令

    #-*- coding: utf-8 -*- #!/usr/bin/python import paramiko import threading def ssh2(ip,username,passw ...

  2. sqlserver:rank() over()函数

    先前在oracle数据库中接触过over()函数的一系列使用,但是在实际的sql开发中并没有太多的使用,这次在sqlserver的sql拼写中重新遇到这个函数,故结合网上的例子和项目中实际中使用,将其 ...

  3. UVa 1660 Cable TV Network (最大流,最小割)

    题意:求一个无向图的点连通度. 析:把每个点拆成两个,然后中间连接一个容量为1的边,然后固定一个源点,枚举每个汇点,最小割. 代码如下: #pragma comment(linker, "/ ...

  4. 移动端UI资源

    1.Flat UI Free http://designmodo.github.io/Flat-UI/ 2.POP 原型工具 http://mobilehub.io/products/pop 3.ei ...

  5. E20180514-hm

    invalid  adj. 无效的; 不能成立的; 有病的; 病人用的; readiness n. 准备就绪; 愿意,乐意

  6. STL——pair

    功能:pair将一对值组合成一个值,这一对值可以具有不同的数据类型(T1和T2),两个值可以分别用pair的两个公有函数first和second访问. #include <bits/stdc++ ...

  7. Lightoj1000【简单A+B】

    balababalabalabala! #include<stdio.h> #include<queue> #include<string.h> #include& ...

  8. 51nod1267(双指针)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1267 题意:中文题诶- 思路:双指针 求a+b+c+d=0,令 ...

  9. sql数据库查询结果字段包含换行符导致复制到Excel发生错位问题的解决

    问题描述:在工作过程中,有时会遇到这样的问题,写好sql查询语句在数据库中查询数据,看到行数(比如说是1000行),但是把查询结果复制到Excel里面,却发生了行列错位问题,而导致Excel里面的行数 ...

  10. C++中各种简写及全称的库

    ATL(Active TEmplate Library)活动模板库 RPC(Remote Procedure Call Protocol)远程过程调用协议 DCE(Distributed Comput ...