FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 并基于标准的 Python 类型提示。
关键特性:
- 快速:可与 NodeJS 和 Go 并肩的极高性能(归功于 Starlette 和 Pydantic)。最快的 Python web 框架之一。
- 高效编码:提高功能开发速度约 200% 至 300%。
- 更少 bug:减少约 40% 的人为(开发者)导致错误。
- 智能:极佳的编辑器支持。处处皆可自动补全,减少调试时间。
- 简单:设计的易于使用和学习,阅读文档的时间更短。
- 简短:使代码重复最小化。通过不同的参数声明实现丰富功能。bug 更少。
- 健壮:生产可用级别的代码。还有自动生成的交互式文档。
- 标准化:基于(并完全兼容)API 的相关开放标准:OpenAPI (以前被称为 Swagger) 和 JSON Schema。
简单来体验一下:
环境:
- Python 3.11
- Windows 10
- fastapi 0.68.0
1,安装 fastapi
pip install fastapi
2,安装一个 ASGI 服务器
pip install "uvicorn[standard]"
ASGI(Asynchronous Server Gateway Interface)是 Python 异步服务器网关接口的缩写。
它定义了异步编程风格的 Python Web 服务器与 Web 服务器和应用程序之间的标准接口。
ASGI 旨在解决传统 Python Web 服务器(如WSGI)在高并发和长连接场景下的不足,使用异步编程模型来提高服务器的并发处理能力。
ASGI服务器具有以下几个关键特点:
- 异步和事件驱动:ASGI 服务器采用异步非阻塞的编程模型,可以高效处理大量并发连接,避免进程/线程阻塞。它使用事件循环机制,在有事件到来时处理,否则释放资源做其他事情。
- 支持长连接和WebSocket:ASGI 服务器本身支持长连接和 WebSocket 协议,可用于构建实时通信应用,如在线聊天室、协作平台等。
标准统一接口:ASGI 定义了统一的服务器端接口规范,使Web服务器、中间件和应用程序之间松散耦合,易于拓展和维护。
高性能:相比传统 WSGI,ASGI 编程模型使用异步协程可以大幅降低上下文切换和内存开销,从而提高并发性能。目前支持 ASGI 的服务器有 Uvicorn、Daphne、Hypercorn 等,应用框架包括 Django Channels、FastAPI 等。ASGI 正在逐渐取代 WSGI 成为 Python Web 应用开发的新标准,特别适合于需要高并发、实时双向通信的应用场景。
3,创建一个 main.py 文件
from typing import Union
from fastapi import FastAPI
# 创建 FastAPI 实例
app = FastAPI()
# 定义路由,处理 get 请求
@app.get("/")
# 定义路由处理函数
async def read_root():
return {
"Hello": "World"}
# 定义路由,处理 get 请求,接收一个路径参数 item_id
@app.get("/items/{item_id}")
async def read_item(
item_id: int,
q: str = 'default',
):
return {
"item_id": item_id, "q": q}
4,运行项目
$ uvicorn main:app --reload
INFO: Will watch for changes in these directories: ['I:\\Python\\Web\\FastAPI\\fastApiProject1']
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [14776] using WatchFiles
INFO: Started server process [24944]
INFO: Waiting for application startup.
INFO: Application startup complete.
- main:main.py 文件(一个 Python “模块”)。
- app:在 main.py 文件中通过
app = FastAPI()创建的对象。 - –reload:让服务器在更新代码后重新启动。仅在开发时使用该选项。
5,浏览器访问路由
访问 http://127.0.0.1:8000/ 可以在页面看到路由处理函数返回的数据:

访问 http://127.0.0.1:8000/items/5?q=somequery 可以在页面看到路由处理函数返回的数据:

6,体验类型声明的优势
浏览器访问 http://127.0.0.1:8000/docs 可以到达 API 界面:

但是国内可能打不开。
fastapi访问/docs和/redoc接口文档显示空白或无法加载
FastAPI 自动文档Swagger UI 打不开。显示空白
打开这个页面,我们可以看到非常详细的 API 描述:

- item_id:integer类型,是一个路径参数,而且是必需的。
- q:string 类型,是一个查询参数,而且不是必需的。
这是怎么做到的?回到代码:
@app.get("/items/{item_id}")
def read_item(
item_id: int,
q: str = 'default',
):
return {
"item_id": item_id, "q": q}
路由装饰器中定义了路径 /items/{item_id},路径参数 item_id 在路由处理函数中明确定义为 int 数据类型,且未指定默认值,路径参数是用户必须传递的。
路由处理函数中,q 明确定义为 str 数据类型,且赋予了一个默认值 default,这种不是路径参数的路由处理函数参数就是查询参数。
- 把默认值设为 None 即可声明可选的查询参数
最重要的特征就是,我们为参数添加了类型声明,这样做有非常多好处:
- 由 FastAPI 通过类型声明自动将解析请求中的字符串转为声明的数据类型:

2,更方便地利用编辑器的自动提示:

7,借助 Pydantic 完成数据验证
多数情况我们会用 POST(最常用)、PUT 操作来发送数据,具体就是将数据放在这些请求的请求体中。
既然路径参数和查询参数都可以通过定义数据类型来完成默认的类型转化和校验,那么作为传述数据主要载体的请求体,自然也支持数据类型的定义带来的好处,响应体也是如此!
请求体和响应体的数据定义需要使用 pandatic,这是一个流行的数据验证工具。使用 Pydantic 模型声明请求体,能充分利用它的功能和优点:
- 以 JSON 形式读取请求体。(在必要时)把请求体转换为对应的类型
- 校验数据:数据无效时返回错误信息,并指出错误数据的确切位置和内容
- 把接收的数据赋值给参数 item:把函数中请求体参数的类型声明为 Item,还能获得代码补全等编辑器支持
- 为模型生成 JSON Schema,在项目中所需的位置使用
- 用于 API 文档 UI
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str | None = None
price: float
tax: float | None =

:初识 fastapi&spm=1001.2101.3001.5002&articleId=139609822&d=1&t=3&u=919c7838d29e4329b9eb16018587de87)
1万+

被折叠的 条评论
为什么被折叠?



