1.介绍
前言: 不管学什么语言,都应该至少掌握一个框架,方面我们后续,进行服务部署、服务对外支持等;
1.1 官网介绍
下面是来自FastAPI
官网的介绍:
FastAPI
是一个用于构建 API
的现代、快速(高性能)的 web
框架,使用 Python 3.8+
并基于标准的 Python
类型提示。
关键特性:
快速:可与 NodeJS 和 Go 并肩的极高性能(归功于
Starlette 和 Pydantic
)。最快的 Python web 框架之一。高效编码:提高功能开发速度约 200% 至 300%。
更少 bug:减少约 40% 的人为(开发者)导致错误。
智能:极佳的编辑器支持。处处皆可自动补全,减少调试时间。
简单:设计的易于使用和学习,阅读文档的时间更短。
简短:使代码重复最小化。通过不同的参数声明实现丰富功能。bug 更少。
健壮:生产可用级别的代码。还有自动生成的交互式文档。
标准化:基于(并完全兼容)API 的相关开放标准:OpenAPI (以前被称为
Swagger
) 和 JSON Schema。
1.2 Github热度
框架 | Star |
开源地址 |
---|---|---|
django |
73.9k |
https://github.com/django/django |
flask |
64.9K |
https://github.com/pallets/flask |
fastapi |
64.3K |
https://github.com/tiangolo/fastapi |
关于选框架一事,每个人的见解都不一样,这里不做比较,简单陈述下,我之所以选择这个框架的原因:
- 号称和
Go
并肩的极高性能, 想体验下; - 框架和之前两个对比,相对比较年轻,从
Github star
数来看,成长热度挺好; - 官方文档中文支持较好,看着也比较完善;
2.依赖安装
@注意: fastapi有版本要求,需要的
Python
版本至少是Python 3.8
2.1 安装fastapi
|
2.2 安装ASGI 服务器
ASGI
是异步网关协议接口,一个介于网络协议服务和Python
应用之间的标准接口,能够处理多种通用的协议类型,包括HTTP,HTTP2
和WebSocket
。
|
这里简单了解下什么是uvicorn
:
Uvicorn
是一个基于ASGI(Asynchronous Server Gateway Interface)
的异步Web
服务器,用于运行异步Python web
应用程序。它是由编写FastAPI
框架的开发者设计的,旨在提供高性能和低延迟的Web
服务;
3. 快速启动
3.1 编写代码
main.py
|
3.2 启动服务
|
启动命令uvicorn main:app --reload中的app,指的是app = FastAPI()变量,也可以是其他自己定义的名称;
1.启动步骤分析:
- 第一步: 导入
FastAPI
(from fastapi import FastAPI
),可以把FastAPI
理解为是API
提供所有功能的Python
类; - 第二步: 创建
FastAPI
实例(app = FastAPI()
),实例化一个类,变量app
是FastAPI
的类实例; - 第三步: 使用
@app.get
注册路由,其中app
是FastAPI
类实例变量名,也可以是其他;除了@app.get
之外还支持:@app.post、@app.put、@app.delete..
等方法; - 第四步: 使用
uvicorn
启动服务;
3.3 调试模式
虽然通过uvicorn
启动服务很方便,但有时候我们需要debug
本地程序,方便问题排查,FastAPI
也支持传统启动方式;修改main.py
文件,追加以下代码:
|
以Debug
模式启动后,就可以打断点进行代码调试,具体使用方法可参考官方文档:https://fastapi.tiangolo.com/zh/tutorial/debugging
4.访问服务
4.1 访问接口
4.2 访问文档
FastApi
框架在启动时,除了注册路由之外,还会自动生成API
在线文档,并且生成两种在线文档: Swagger UI 和 ReDoc,访问地址分别为:
SwaggerUi风格文档:
http://127.0.0.1:8000/docsReDoc风格文档:
http://127.0.0.1:8000/redoc
1.如何关闭文档生成?
如果不想生成交互式文档,可以通过以下方式实例化FastAPI
:
|
4.3 访问OpenAPI
FastAPI
框架内部实现了OpenAPI
规范,通过访问 http://127.0.0.1:8000/openapi.json,我们可以看到整个项目的 API
对应的JSON
描述信息,如下:
|
5.目录结构
5.1 官方示例目录结构
通常我们开发一个Python
服务,都不会将所有代码放到一个文件里,就像我们不会把衣服、鞋子、袜子、食物这些统统装到一个麻袋里一样; 而是会根据功能或者其他规则,分类存放,FastAPI
为我们提供了一个模板,具体如下:
|
具体代码组织可以参考 更大的应用 - 多个文件: https://fastapi.tiangolo.com/zh/tutorial/bigger-applications/
5.2 自定义目录结构
个人感觉官方推荐的目录结构过于简单,和工作中经常使用的其他语言框架目录结构出入过大,所以进行了自定义修改,也是为了适应自己的开发习惯,具体修改后目录如下:
|
a.__init__.py
文件的作用:
标识包目录: 当Python解释器遇到一个目录中包含
__init__.py
文件时,它会将该目录识别为一个包。这样可以通过导入包的方式来组织和访问模块。 在Python3
中,__init__.py
不再是创建包的唯一方式初始化包:
__init__.py
文件在包被导入时会被执行,可以用于初始化包级别的变量、设置环境或执行其他必要的初始化操作。命名空间包含: 通过在
__init__.py
中定义变量、函数或类,可以将它们添加到包的命名空间中,使得在导入包时可以直接访问这些元素。避免名称冲突: 如果包目录中有与包同名的模块,导入包时可能会出现冲突。
__init__.py
可以通过定义__all__
变量来控制导入时的名称空间。# __init__.py
__all__ = ['module1', 'module2']这样导入包时,只有在
__all__
中列出的模块会被导入,避免了潜在的名称冲突
6. 路由加载
6.1 路由文件
假如我们在app/router
目录下有以下几个文件:
|
每个路由文件里面的编辑流程和逻辑基本一样,这里以default_router.py
为例,代码如下:
|
6.2 官方加载示例
文档地址: https://fastapi.tiangolo.com/zh/tutorial/bigger-applications/#fastapi
在主体文件main.py
中,代码如下:
|
6.3 优化导入
1.编辑app/router/__init__.py
|
在__init__.py
中定义变量,把要注册的路由统一放在列表中,然在main.py
中通过循环加载路由;后续有新增路由时,直接在列表中新增元素即可;
2.修改main.py
|