Flask Run运行机制剖析

news2024/11/17 0:39:53

一、前言

已经玩了一段时间Flask ,每次调用app.run(或flask run)就可以启动应用,今天我们就来了解一下run背后究竟做了些什么事情。

注:通过上面几行代码就可以启动一个Flask服务器,打开浏览器输入http://127.0.0.1:5000, 页面上就能显示Hello,Qingcai18036!,实在是够简单的。

二、WSGI介绍

WSGI全称Web Server Gateway Interface ,它是一个规范,定义了Web服务器如何与Python应用程序进行交互,使得Python写的Web应用程序可以和Web服务器对接起来,它与JAVA体系中的Servlet是差不多的概念。

注:application定义WSGI接口,是一个标准的http处理函数.applicaton必须由WSGI服务器调用,这里我们用了Python内置的WSGI模块wsgiref,它是WSGI服务器的参考实现。

make_server()创建服务器,设置处理函数是application,然后调用serve_forever()启动监听。但一般我们几乎不会直接写WSGI接口,这样编写代码还是过于低级编写维护困难,然后在WSGI基础上进一步抽象,用一个函数处理一个URL,这样就交由Web框架来做,实现WSGI的Web框架有Flask、Django、Tornado等等。

三、Werkzeug

Werkzeug它是一个WSGI工具包,它可以做为Web框架的底层库,Flask就是基于Werkzeug开发的。当然它还有一个安全工具包,可以参见《Werkzeug生成散列值》

四、从app.run说起

app = Flask(__name__)构建Flask应用,Flask对象实现WSGI规范,Flask应用创建成功后,它将提供视图、路由、模板配置功能。

注:run后调用概略时序图,从Flask->Werkzeug->Python HTTPServer

注:app.run调用app.py中的run方法,run方法中导入了 werkzeug.serving 中的 run_simple 函数并执行该函数。

注:run_simple方法执行了make_server并返回srv。

注:make_server根据threaded参数值(外部传入的是True)执行ThreadedWSGIServer。

注:ThreadedWSGIServer其实是对BaseWSGIServer的扩展。

注:BaseWSGIServer -> HTTPServer -> TCPServer -> BaseServer 其中BaseWSGIServer是werkzeug组件中的,而其它HTTPServer、TCPServer、BaseServer是Python内置的模块。

在BaseServer有serve_forever的实现多路复用监听,当请求就绪后会调用_handle_request_noblock来处理请求。

然后会调用

注:BaseRequestHandler在实例化时就会执行handler()方法,这个由子类去实现。

注:这就是 WSGI 协议中服务器调用 Web 服务规定的方法。

总结为一句话:Flask 依赖 Werkzug 的 run_simple 函数启动服务,而 run_simple 通过对 Python 标准的 Web 服务器的拓展,实现了请求交由 Flask 处理的过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1142712.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sharepoint2016-2019升级到sharepoint订阅版

一、升级前准备: 要建立新的sharepoint订阅版环境,需求如下: 1.单服务器硬件需求CPU 4核,内存24G以上,硬盘300G(根据要迁移的数量来扩容大小等); 2.操作系统需要windows server 20…

得物 Redis 设计与实践yu

一、前言 自建 Redis 系统是得物 DBA 团队自研高性能分布式 KV 缓存系统,目前管理的 ECS 内存总容量超过数十TB,数百多个 Redis 缓存集群实例,数万多个 Redis 数据节点,其中内存规格超过 1T 的大容量集群多个。 自建 Redis 系统采…

Linux系统下配置王爽汇编语言环境

【步骤一】 先打开命令行,进入root模式,输入如下语句: sudo apt-get install dosbox 该语句的作用主要是安装dosbox 【步骤二】 安装完成之后,命令行输入dosbox 会进入dosbox页面: 【步骤三】 在你的主机中&…

thinkphp6 自定义命令行command使用

在tp框架中往往需要定义一些命令去大批量的操作行为,直接在控制器中会有超时报错的情况,而且也会很慢,所以就需要使用到tp里的自定义命令行来完成这些操作行为。 比如:现在有一张表数据有上百万,要更新表中某个字段的…

宝塔面板安装Python和Flask(新版Python项目)

(一)宝塔面板的项目菜单,打开Python项目的“项目版本管理” 安装Python版本3.10.0。 会创建一个Python版本的文件夹www/server/pyproject_evn/versions/ 会创建一个Python虚拟环境的文件夹www/server/pyproject_evn/python_venv/ &#xf…

深入探讨Docker生态系统,Docker Compose vs. Docker Swarm vs. Kubernetes:深入比较

文章目录 Docker ComposeDocker SwarmKubernetesDocker Compose适用场景 Docker Swarm适用场景 Kubernetes适用场景 对比和结论 🎈个人主页:程序员 小侯 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏&#xf…

【小黑嵌入式系统第五课】嵌入式系统开发流程——开发工具、交叉开发环境、开发过程(生成调试测试)、发展趋势

上一课: 【小黑嵌入式系统第四课】嵌入式系统硬件平台(二)——I/O设备、通信设备(UART&USB&蓝牙)、其他(电源&时钟&复位&中断) 文章目录 一 嵌入式软件开发工具的分类二 嵌…

Express框架开发接口之登录与注册API

我们利用nodeexpressmysql开发接口,对数据库数据进行简单增、删、查改等操作。 接口是什么? 接口是 前后端通信的桥梁 简单理解:一个接口就是 服务中的一个路由规则 ,根据请求响应结果 接口的英文单词是 API (Application Progra…

分支预测机制

在Linux中,__predict_false和__predict_true是用于优化分支预测的宏。这些宏通过向编译器提供关于条件分支可能结果的提示,来帮助生成更有效的机器代码。 __predict_false宏扩展为一个属性,该属性指示编译器预测给定分支可能为假。这意味着&…

jdk20 升级, gson 的坑

项目部署在服务器中请求报下面这个错 java.lang.reflect.InaccessibleObjectException: Unable to make private java.util.Collections$EmptyList() accessible: module java.base does not "opens java.util" to unnamed module 2c35e847at java.base/java.lang.r…

制作一个简单的C语言词法分析程序

1.分析组成 C语言的程序中,有很单词多符号和保留字。一些单词符号还有对应的左线性文法。所以我们需要先做出一个单词字符表,给出对应的识别码,然后跟据对应的表格来写出程序 2.程序设计 程序主要有循环判断构成。不需推理即可产生的符号我…

【需水预测】区域需水量预测方法-定额法

区域需水量预测方法-定额法 1 生活用水需水量预测1.1 人口指标预测1.2 居民生活综合用水定额分析 2 农业需水量预测2.1 农田灌溉需水量2.2 林牧渔业需水量另:灌溉面积定义 3 工业需水量预测3.1 工业增加值发展指标预测 4 生态需水量预测4.1 生态环境面积发展指标预测…

APP自动化测试 ---- Appium介绍及运行原理

在面试APP自动化时,有的面试官可能会问Appium的运行原理,以下介绍Appium运行原理。 一、Appium介绍 1.Appium概念 Appium是一个开源测试自动化框架,可用于原生,混合和移动Web应用程序测试。它使用WebDriver协议驱动IOS&#xf…

工具分享:腾讯云价格计算器使用方法_服务器报价不求人

腾讯云服务器价格计算器可以一键计算出云服务器的精准报价,包括CVM实例规格价格、CPU内存费用、公网带宽收费、存储系统盘和数据盘详细费用,腾讯云百科txybk.com分享腾讯云价格计算器链接入口、使用方法说明: 腾讯云服务器价格计算器 打开腾…

项目经验分享|openGauss 陈贤文:受益于开源,回馈于开源

开源之夏 项目经验分享 2023 #08 # 关于 openGauss 社区 openGauss是一款开源关系型数据库管理系统,采用木兰宽松许可证v2发行。openGauss内核深度融合华为在数据库领域多年的经验,结合企业级场景需求,持续构建竞争力特性。同时openGauss也是…

树莓派基金会近日发布了新版基于 Debian 的树莓派操作系统

导读树莓派基金会(Raspberry Pi Foundation)近日发布了新版基于 Debian 的树莓派操作系统(Raspberry Pi OS),为树莓派单板电脑带来了新的书虫基础和一些重大变化。 新版 Raspberry Pi OS 的最大变化是它现在基于最新的…

为了让女儿学打字,开发了个免费的打字网站

以后计算机也算是门手艺活了,想要增加沟通效率还是从入门打字开始。 之前小时候也玩过各种各样的打字游戏,警察抓小偷、打蜜蜂之类的,小的时候也没有各种教程不方便,一指禅玩这种游戏真的是累死,也没有任何提示。急得直…

如何分离一个要素的shp矢量文件:利用ArcGIS分割工具

下面介绍如何用ArcGIS对含有多个分离区域的一整个面要素进行分割 如下图,现在想要将下方的长形shp提取出来,首先打开shp文件: 右击空白处查看该矢量文件的投影信息: 在文件夹中新建shp文件,设置一样的投影&#xff1a…

docker - win10 家庭版 开始虚拟化

文章目录 前言docker - win10 家庭版 开始虚拟化 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊…

ETCD备份与恢复

文章目录 主要内容一.备份1.先安装etcd客户端代码如下(示例): 2.备份成文件并查看代码如下(示例): 3.解释 二.恢复1.先停止服务代码如下(示例): 2.删除现有ETCD,并恢复数据代码如下(…