问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

FastAPI - 一款新型的 Python Web 框架(对比 Flask)

发布网友 发布时间:2022-10-03 12:57

我来回答

1个回答

热心网友 时间:2023-10-10 11:13

近日只是为了想尽办法为 Flask 实现 Swagger UI 文档功能,基本上要让 Flask 配合 Flasgger, 所以写了篇 Flask 应用集成 Swagger UI 。然而不断的 Google 过程中偶然间发现了 FastAPI 这么一款集成了 Swagger UI 的更新的 Python Web 框架。起初想要在标题中表达的意思大概是 Flask + Swagger = FastAPI, 后来发现 FastAPI 的闪亮点不仅如此,顺便找了些 Flask 与 FastAPI 对比的文章来,在文后附有链接。

本文不对 Flask 与 FastAPI 的各个方面对进行对比,本人兴趣依然还在 FastAPI 的 Swagger UI 功能,以及与 Flask 的 Blueprint 类似的特性。如果要拿 Flask 与 FastAPI 比较的话,应该用 Flask 2.x, 因为它开始支持类似 @app.get 的装饰器,并引入了 async 路由函数。

Flask 是在 2010 年发布的,它构建于 WSGI(Python Web Server Gateway Interface) 之上的,产品环境中运行需与 uWSGI, Gunicorn 搭配,或用 mod_wsgi 模块与 Apache 集成。因发布较早,所以目前应该有较多的使用者。Flask 2.0 需要 Python 3.6+ 的支持,如果支持 async , 需 Python 3.7+

FastAPI 发布于 2018 年,构建于 ASGI(Asynchronous Server Gateway Interface) 之上,在 IO 密集型的应用中有更优越的性能。生成环境中配合 ASGI 服务器,如 Uvicorn 或 Hypercorn . FastAPI 最为亮丽的特性是集成了 Swagger UI -- 外加一个福利 ReDoc 。FastAPI 需 Python 3.6+ 版本。

毕竟是在开始学一个新的框架,还是从它的基本用法开始,途中会穿插与 Flask 的对比。

安装:

当前安装的 fastapi 版本为 0.70.1, uvicorn 版本为 0.16.0。开始第一个例子,摘自官方

创建一个 main.py 文件,内容为

注:以上两个函数前面可以加上 async 关键字

启动服务,用命令

注: uvicorn --help 列出详细帮助,如启动多少个 worker, 绑定网络接口和端口号, 配置 SSL 证书等。

访问服务

另一个服务就是 http://localhost:8000/items/100?q=somequery

与 Flask 的对比

回顾一个 Flask 启动服务的方式有

如果程序文件名为 app.py 或 wsgi.py 的话,可以省略 FLASK_APP 环境变量,直接执行 flask run 就行。另一种方式就是在代码中加上 main 入口

然后像普通 Python 代码一样执行

对于 FastAPI, 如果总是要用 uvicorn 来启动服务的话,在 IDE 中调用就变得不那么便利。由于 uvicorn 本身就是 Python 实现,当然也就可以把命令过程写到 Python 代码中

注:uvicorn.run() 可接受更多的参数,相当于 uvicorn --help 可接受的。

同样把 main.py 当作普通 Python 程序来启动即可

前面讲过,FastAPI 进入我的视野最首要的一个原因就是它集成了 Swagger UI, 在启动了 FastAPI 服务后,只要访问 http://localhost:8000/docs, 熟悉的 Swagger UI 即刻映入眼帘

同时注意到函数映射为 API 的名称,由于参数是带有类型提示的,所以在 SwaggerUI 中也能看到相应的类型。其他定制 Swagger UI 的工作需要时可细细研究。

FastAPI 除了 SwaggerUI 外,还同时给了我们另一个选择,那就是 redoc, 访问 http://localhost:8000/redoc, 看到下面的界面

我也是头一回从 FastAPI 这里了解到还有一个 Redoc 的 Web API 文档工具,它和 SwaggerUI 类似,都是支持 Open API。

使用 FastAPI 时,在 API 文档中产生请求/响应的 Model 类型也很简单,下面的例子同时包含自定义的输入输出类型

下面是 main.py 的全新内容

再查看 http://localhost:8000/docs 文档,看到 PUT /items/{item_id} 的界面如下

我们能看到请求与响应中的 Example Value 和 Schema 定义

梳理完 FastAPI 的自动 API 文档功能,进入下一个话题

FastAPI 类似于 Flask 的 Blueprints 功能没有一个特定的名称,只笼统的给出解决方案 Bigger Applications - Multiple Files . 我们来看一下它是怎么实现的。这里简化官方的例子,排除了 dependencies 的应用,要用到的目录结构为

每个目录中都可以放一个 __init__.py 文件,标识为包,接着是每个文件的内容

app/internal/admin.py

app/routers/items.py

app/routers/users.py

在每个单独定义路由的文件里用到的是 APIRouter , 它相当是一个迷你的 FastAPI , 也类似于 Flask 的 Blueprint . 上面分别演示了两种 APIRouter 的声明方式,声明时带不带 prefix 和 tags。同时在为函数定义路由时也可指定 tags,在后面我们将会注意到 tags 只是为 API 文档分类用的。

app/main.py

这里实际上使用了三种定义路径前缀与 tags(API 分类) 的方式

现在运行

查看 SwaggerUI http://localhost:8000/docs

到目前为止我重点关注 FastAPI 的就是以上那两个特性:自动 API 文档与大程序多文件(Blueprint) 功能。其他的特性可查阅 FastAPI 的 Features 。比如:

原文 https://yanbin.blog/fastapi-new-python-web-framework-vs-flask/
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
金莎丽的淋浴房用完之后开门水会流出来吗? 老家里的开门式淋浴房总是漏水,装修新家想换个质量好点的淋浴房,淋浴房... 淋浴房为何开门不畅?门关不紧怎么办? appa是什么意思英语? ...觉得比较好奇吧。是什么意思?好奇吗。有微信,没聊过 和新认识的男生聊什么跟男生可聊的20个话题 农行用什么pos机有积分 POS机刷卡积分是什么意思? 一个简短的民间小说 小米9.11发布会什么时候可以重播 为什么1号店东西便宜买的人却超少百度评价还很差 我被别人用了? 我的被别人用了怎么找回来? 周公解梦梦见狗去咬人 梦见狗去咬人 的寓意 从微信好友里怎么能找回我的和密码? 1号店 怎么样 画蛇添足的寓言故事 画蛇添足的寓言故事介绍 怎样将所有ppt的背景统一更换,把ppt背景全部更换成一个 网上超市到底怎么样啊?貌似有个叫 1号店 的做的挺大的~ 求微信投票群,急需 梦见自己打败一个和自己很像的人 孙颖莎:你很幸运,也很幸福,接下来心无旁骛地去拼吧 昨晚梦到我家养的一只猫和狗把另一只狗吃了,我想要努力阻止,可最后还是被吃掉了,是怎么回事啊 难兄难弟中金妞家住几号楼 拉布拉多犬的幼崽需要多少钱? 拉布拉多一只多少钱幼崽 拉布拉多犬幼崽多少钱一只公的。 电饼铛第一次使用咋清洗 电饼铛第一次使用正确清洗方法 二级建造师考试网上报名上传照片有什么要求 华晨宇《地球之盐歌词》 口袋妖怪结的魅影四点五版怎样将精灵携带出来 为什么申请的达人信用卡上的uid和我微博上的不同呢 兼职拼多多赚钱吗 淘宝和1号店哪个好? 视频彩铃怎么取消 怎么关闭移动的视频彩铃显示 奶酪棒适合给宝宝吃吗?是健康营养的儿童零食吗 奶酪棒常温会变质吗 奶酪棒家常做法 提高宝宝抵抗力方法如何提高孩子免疫力 布鲁斯口琴高音7如何吹 十孔口琴的高音7怎么吹,我压音总是吹不出来 怎样提高孩子免疫力 提高孩子免疫力的方法介绍 怎么清洗藕孔里面的泥 清洗藕孔里的泥土的方法 中长款毛衣怎么搭配 你会搭配吗 先眼线还是先眼影,怎么办? 世界环境日是每年的哪一天 世界环境日为每年的几月几日几号 世界环境日是几月几日 全民保护世界环境的一天 做爱了不到一分钟会感染艾滋病吗 没戴口罩并且隔了一米远说话一分钟不到会被传染吗 无套高危一分钟,女的要有艾滋病百分百感染吗 如果女方是艾滋携带者,无套一分钟是否会有感染风险