一、认识FastAPI框架
FastAPI 框架,高性能,易学,快速编码,可用于生产的现代化Web框架。
Github:github.com/tiangolo/fa...
这里先引用官网的介绍,然后跟我实践总结的优势进行对比。
主要特点
-
Fast : Very high performance, on par with NodeJS and Go (thanks to Starlette and Pydantic). One of the fastest Python frameworks available. 快速:非常高的性能,与 NodeJS 和 Go 相当(感谢 Starlette 和 Pydantic)。可用的最快的 Python 框架之一。
-
Fast to code: Increase the speed to develop features by about 200% to 300%. * 快速编码:将开发功能的速度提高约 200% 至 300%。
-
Fewer bugs: Reduce about 40% of human (developer) induced errors. 更少的错误:减少约 40% 的人为(开发人员)引起的错误。
-
Intuitive: Great editor support. Completion everywhere. Less time debugging. 直观:强大的编辑器支持。到处都完成。调试时间更少。
-
Easy: Designed to be easy to use and learn. Less time reading docs. 简单:旨在易于使用和学习。阅读文档的时间更少。
-
Short: Minimize code duplication. Multiple features from each parameter declaration. Fewer bugs. 简而言之:最大限度地减少代码重复。每个参数声明具有多个功能。更少的错误。
-
Robust: Get production-ready code. With automatic interactive documentation. 健壮:获取可用于生产的代码。具有自动交互式文档。
-
Standards-based : Based on (and fully compatible with) the open standards for APIs: OpenAPI (previously known as Swagger) and JSON Schema. 基于标准:基于(并完全兼容)API 开放标准:OpenAPI(以前称为 Swagger)和 JSON Schema。
二、FastAPI的优势
Fastapi 的接口文档可以在编写入参、出参模型的时候就可以生成,还可以导入到apifox中,可以减少大量开发时间,并做到了参数校验的效果,以及方便前后端接口对齐,后续只需关注业务逻辑开发,最后就是配上 uvicorn 性能很强。
-
定义好接口入参、出参的Pydantic模型,就可以生成在线的 OpenAPI 在线接口文档,还做到了接口参数校验,可以节省开发时间,最后如果在线文档前端觉得不好用还可以 将OpenAPI.json 导入到apifox中使用十分方便,前端还可以根据apifox的接口文档生成ts代码。
-
暴露了许多内置入口,例如WEB中间件middleware、依赖depends、错误处理 error_handler、应用生命周期钩子函数等,都非常方便接入
-
异步框架,对于没有支持异步方法的第三方库,FastAPI再定义路由函数时,使用普通函数还是会自动开始线程处理,不会阻塞主线程,BackgroundTasks 后台任务也是对同异步函数都已封装好支持,可以让开发更专注业务逻辑处理
-
FastAPI 小巧轻便易学、易使用,跟 Flask 一样小巧,但内置了好多框架函数与装饰器比Flask等其他框架更好使用,其他框架要通过第三方库支持和自己封装。
-
依赖为 Starlette 的 ASGI 异步框架,性能不错,再通过 uvicorn 把Python底层使用的事件循环替换成 uvloop 性能将更强。
这里有很多名词,大家可以先做简单的了解,后面会一一实践与详解。
三、快速上手
PyCharm 新建 HelloWord 上手项目
我这里是创建了一个大项目目录 FastAPI-BookletDemo 用来组织教程中的案例Demo,也方便管理。Python环境采用Conda进行虚拟环境管理。然后我是创建的纯Python项目,PyCharm专业版也可以直接创建FastAPI项目,大家可以自行尝试。
Conda虚拟环境管理:juejin.cn/post/697058...
pip配置国内源:juejin.cn/post/699740...
准备依赖文件并安装
ini
# 单独安装
pip install fastapi==0.101.0
pip install uvicorn==0.23.2
# 依赖文件安装
pip install -r requirements.txt
Python的依赖文件在业界已经约定俗成了都是以 requirements.txt 命名
安装依赖的时候指定依赖的版本有助于项目的稳定。
编写代码并运行项目
python
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Author: Hui
# @Desc: { fastapi hello world 案例 }
# @Date: 2023/08/06 22:16
import uvicorn
from fastapi import FastAPI
app = FastAPI(description="hello world")
@app.get(path="/")
def index():
return "index"
@app.get(path="/hello")
async def hello():
return "hello world"
def main():
uvicorn.run(app)
if __name__ == '__main__':
main()
可以发现FastAPI非常方便的就可以快速构建一个简单的Web项目,并使用装饰器的方式编写路由函数。最后采用 uvicorn 进行运行。
接口访问结果图
docs接口文档效果图
redoc接口文档效果图
四、接口文档导入APIFOX
接口参数多的时候,生成的在线接口文档虽然美观,但还是会有点不便于查看具体参数。我们可以通过FastAPI生成接口文档的 openapi.json 导入到 APIFOX 中进行操作,这样查看与协作就方便多了,不仅可以动态的mock接口数据,方便开发自测,还可以通过接口文档生成对应的语言的接口代码,简直让 FastAPI 的在线文档如虎添翼,大家可以亲自体验下。
查看 openapi.json
入口地址:http://127.0.0.1:8000/openapi.json
其实就是一个接口约束的压缩的json
导入到APIFOX
apifox官网:apifox.com/
需要注册 apifox 账号,然后创建项目导入接口文档就行
加号图标选择导入
然后把FastAPI的接口文档的 openapi.json 的地址复制到这边就可以导入了,可以看见apifox支持导入的格式、种类还是挺多的。
生成接口模型代码
生成TS代码
生成Python模型代码
这里生成的是 python 3.7 的 dataclass 类的模型代码,要是可以多个选择生成 pydantic model 类的代码就好多了,这样无论是先写代码还是先写接口文档都可以节省很多时间,也保证了项目的质量,但可以通过一些GPT帮忙根据dataclass类转成业务需要的。
分模块组织的接口
分模块组织接口要通过FastAPI 的 APIRouter 会更方便些,也更符合中、大工程项目的搭建。
大家可以看官网的介绍:fastapi.tiangolo.com/tutorial/bi...
如下是我一个基于 FastAPI 开发的开源项目的接口文档,大家感兴趣也可以参考一下。
github:github.com/HuiDBK/HuiH...