当前位置: 首页 > article >正文

Flask Run运行机制剖析

一、前言

已经玩了一段时间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.kler.cn/a/106873.html

相关文章:

  • layui.all.js:2 Uncaught Error: Syntax error, unrecognized expression
  • 2024 年(第 7 届)“泰迪杯”数据分析技能赛B 题 特殊医学用途配方食品数据分析 完整代码 结果 可视化分享
  • 整理iPhone空间:iphone怎么删除相簿
  • 爬虫补环境案例---问财网(rpc,jsdom,代理,selenium)
  • Linux系统编程多线程之条件变量和信号量讲解
  • 01:(手撸HAL+CubeMX)时钟篇
  • Kafka - 3.x 副本不完全指北
  • 工业相机常见的工作模式、触发方式
  • linux可用内存不足如何排查清理
  • easyExcel按模板填充数据,处理模板列表合并问题等,并导出为html,pdf,png等格式文件demo
  • github中.gitignore不起作用啦
  • 蓝桥算法赛(铺地板)
  • Linux下复制一个大于1T的文件夹命令
  • 配置Super-VLAN下的DHCP服务器示例
  • Harmony 个人中心(页面交互、跳转、导航、容器组件)
  • Python数据结构——树
  • 如何做到在 5 分钟之内将应用大小减少 60% 的?
  • Flink将数据写入MySQL(JDBC)
  • C#,数值计算——分类与推理,基座向量机高斯核(Svmgausskernel)的计算方法与源程序
  • Vue3.3指北(三)
  • 06.K8S常用命令
  • Java练习题2020-4
  • 第1篇 目标检测概述 —(3)目标检测评价指标
  • 【uniapp+云函数调用】人脸识别,实人认证,适用于app,具体思路解析,已实现
  • 简单的谈谈VPN是什么、类型、使用场景以及工作原理?
  • 【云原生】portainer管理多个独立docker服务器