FastAPI¶
FastAPI框架,高性能,易学,快速编码,准备生产
文档: https://fastapi.tiangolo.com
源代码: https://github.com/fastapi/fastapi
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于基于标准 Python 类型提示构建 API。
其主要特点包括:
- 快速:极高的性能,与 NodeJS 和 Go 相当(得益于 Starlette 和 Pydantic)。最快的 Python 框架之一。
- 快速编码:将功能开发速度提高约 200% 到 300%。*
- 更少的错误:减少约 40% 的人为(开发者)导致的错误。*
- 直观:出色的编辑器支持。自动完成无处不在。减少调试时间。
- 简单:设计易于使用和学习。减少阅读文档的时间。
- 简洁:最小化代码重复。每个参数声明的多个功能。更少的错误。
- 健壮:获取生产就绪的代码。自动交互式文档。
- 基于标准:基于(并完全兼容)API 的开放标准:OpenAPI(以前称为 Swagger)和 JSON Schema。
* 基于内部开发团队构建生产应用程序的测试估算。
赞助商¶
观点¶
"[...] 我最近大量使用 FastAPI。[...] 我实际上计划在微软的所有 ML 服务**中使用它。其中一些正在集成到 **Windows 产品和一些 Office 产品中。"
"我们采用了 FastAPI 库来启动一个 REST 服务器,可以查询以获取 预测。[用于 Ludwig]"
"Netflix 很高兴宣布我们的 危机管理 编排框架 Dispatch 的开源发布![使用 FastAPI 构建]"
"我对 FastAPI 感到无比兴奋。它太有趣了!"
"说实话,你构建的东西看起来非常扎实和精致。在很多方面,这就是我希望 Hug 成为的样子——看到有人构建出这样的东西真的很鼓舞人心。"
"如果你正在寻找一个用于构建 REST API 的 现代框架,看看 FastAPI [...] 它快速、易于使用且易于学习 [...]"
"我们已经切换到 FastAPI 来构建我们的 API [...] 我想你会喜欢它的 [...]"
"如果有人正在构建一个生产级的 Python API,我强烈推荐 FastAPI。它设计精美、使用简单且高度可扩展,已经成为我们 API 优先开发策略中的关键组件,并推动了许多自动化和服务,如我们的虚拟 TAC 工程师。"
Typer,CLI 中的 FastAPI¶
如果你正在构建一个用于终端的 CLI 应用程序,而不是一个 Web API,请查看 Typer。
Typer 是 FastAPI 的小兄弟。它的目标是成为 CLI 中的 FastAPI。⌨️ 🚀
要求¶
FastAPI 站在巨人的肩膀上:
安装¶
创建并激活一个 虚拟环境,然后安装 FastAPI:
$ pip install "fastapi[standard]"
---> 100%
注意:确保将 "fastapi[standard]"
放在引号中,以确保它在所有终端中都能正常工作。
示例¶
创建它¶
- 创建一个文件
main.py
,内容如下:
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
或者使用 async def
...
如果你的代码使用 async
/ await
,请使用 async def
:
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
注意:
如果你不确定,请查看文档中关于 async
和 await
的 "匆忙中?" 部分。
运行它¶
使用以下命令运行服务器:
$ fastapi dev main.py
╭────────── FastAPI CLI - 开发模式 ───────────╮
│ │
│ 服务地址: http://127.0.0.1:8000 │
│ │
│ API 文档: http://127.0.0.1:8000/docs │
│ │
│ 运行在开发模式,用于生产环境请使用: │
│ │
│ fastapi run │
│ │
╰─────────────────────────────────────────────╯
INFO: 将监视这些目录中的更改: ['/home/user/code/awesomeapp']
INFO: Uvicorn 运行在 http://127.0.0.1:8000 (按 CTRL+C 退出)
INFO: 启动了 reloader 进程 [2248755] 使用 WatchFiles
INFO: 启动了服务器进程 [2248757]
INFO: 等待应用程序启动。
INFO: 应用程序启动完成。
关于命令 fastapi dev main.py
...
命令 fastapi dev
读取你的 main.py
文件,检测其中的 FastAPI 应用,并使用 Uvicorn 启动服务器。
默认情况下,fastapi dev
会启用自动重载功能以进行本地开发。
你可以在 FastAPI CLI 文档 中了解更多信息。
检查一下¶
在浏览器中打开 http://127.0.0.1:8000/items/5?q=somequery。
你将看到如下的 JSON 响应:
{"item_id": 5, "q": "somequery"}
你已经创建了一个 API,它可以:
- 接收 路径
/
和/items/{item_id}
中的 HTTP 请求。 - 这两个 路径 都接受
GET
操作(也称为 HTTP 方法)。 - 路径
/items/{item_id}
有一个 路径参数item_id
,它应该是int
类型。 - 路径
/items/{item_id}
有一个可选的str
查询参数q
。
交互式 API 文档¶
现在转到 http://127.0.0.1:8000/docs。
你将看到自动生成的交互式 API 文档(由 Swagger UI 提供):
替代 API 文档¶
现在,转到 http://127.0.0.1:8000/redoc。
你将看到另一种自动生成的文档(由 ReDoc 提供):
示例升级¶
现在修改 main.py
文件以接收来自 PUT
请求的请求体。
使用 Pydantic 声明请求体,得益于标准的 Python 类型。
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: Union[bool, None] = None
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
return {"item_name": item.name, "item_id": item_id}
fastapi dev
服务器应该会自动重新加载。
交互式 API 文档升级¶
现在转到 http://127.0.0.1:8000/docs。
- 交互式 API 文档将自动更新,包括新的请求体:
- 点击“Try it out”按钮,你可以填写参数并直接与 API 交互:
- 然后点击“Execute”按钮,用户界面将与你 API 通信,发送参数,获取结果并显示在屏幕上:
替代 API 文档升级¶
现在,转到 http://127.0.0.1:8000/redoc。
- 替代文档也将反映新的查询参数和请求体:
总结¶
总之,你只需**一次**声明参数、请求体等的类型作为函数参数。
你使用标准的现代 Python 类型来完成这些。
你不需要学习新的语法、特定库的方法或类等。
只需标准的 Python。
例如,对于一个 int
:
item_id: int
或者对于一个更复杂的 Item
模型:
item: Item
...通过这一单一声明,你将获得:
- 编辑器支持,包括:
- 自动补全。
- 类型检查。
- 数据验证:
- 当数据无效时,自动且清晰的错误信息。
- 即使是深度嵌套的 JSON 对象也能进行验证。
- 输入数据转换:将来自网络的数据转换为 Python 数据和类型。从以下位置读取:
- JSON。
- 路径参数。
- 查询参数。
- Cookies。
- Headers。
- 表单。
- 文件。
- 输出数据转换:将 Python 数据和类型转换为网络数据(如 JSON):
- 转换 Python 类型(
str
、int
、float
、bool
、list
等)。 datetime
对象。UUID
对象。- 数据库模型。
- ...以及更多。
- 转换 Python 类型(
- 自动交互式 API 文档,包括 2 种替代用户界面:
- Swagger UI。
- ReDoc。
回到之前的代码示例,FastAPI 将会:
- 验证
GET
和PUT
请求的路径中是否存在item_id
。 - 验证
GET
和PUT
请求的item_id
是否为int
类型。- 如果不是,客户端将看到一个有用且清晰的错误信息。
- 检查
GET
请求中是否存在名为q
的可选查询参数(例如http://127.0.0.1:8000/items/foo?q=somequery
)。- 由于
q
参数被声明为= None
,因此它是可选的。 - 如果没有
None
,它将是必需的(就像PUT
请求中的主体一样)。
- 由于
- 对于
/items/{item_id}
的PUT
请求,读取 JSON 格式的请求体:- 检查它是否有一个必需的属性
name
,该属性应为str
类型。 - 检查它是否有一个必需的属性
price
,该属性必须为float
类型。 - 检查它是否有一个可选的属性
is_offer
,该属性应为bool
类型(如果存在)。 - 所有这些也适用于深度嵌套的 JSON 对象。
- 检查它是否有一个必需的属性
- 自动进行 JSON 的转换。
- 使用 OpenAPI 文档化所有内容,这些文档可以被以下工具使用:
- 交互式文档系统。
- 自动生成客户端代码的系统,适用于多种语言。
- 直接提供 2 个交互式文档的 Web 界面。
我们只是触及了表面,但你已经了解了它的工作原理。
尝试更改以下代码行:
return {"item_name": item.name, "item_id": item_id}
...从:
... "item_name": item.name ...
...改为:
... "item_price": item.price ...
...并查看你的编辑器如何自动补全属性和了解它们的类型:
有关包含更多功能的更完整示例,请参阅 教程 - 用户指南。
剧透警告:教程 - 用户指南包括:
- 从其他不同位置声明**参数**,如:headers、cookies、表单字段**和**文件。
- 如何设置**验证约束**,如
maximum_length
或regex
。 - 一个非常强大且易于使用的**依赖注入**系统。
- 安全性和认证,包括对 OAuth2 与 JWT 令牌**以及 **HTTP Basic 认证的支持。
- 声明**深度嵌套的 JSON 模型**的更高级(但同样简单)的技术(感谢 Pydantic)。
- 与 Strawberry 和其他库集成的 GraphQL。
- 许多额外的功能(感谢 Starlette),如:
- WebSockets
- 基于 HTTPX 和
pytest
的极其简单的测试 - CORS
- Cookie 会话
- ...以及更多。
性能¶
独立的技术基准测试显示,在 Uvicorn 下运行的 FastAPI 应用程序是 可用的最快的 Python 框架之一,仅低于 Starlette 和 Uvicorn 本身(FastAPI 内部使用)。(*)
要了解更多信息,请参阅 基准测试 部分。
依赖项¶
FastAPI 依赖于 Pydantic 和 Starlette。
standard
依赖项¶
当你使用 pip install "fastapi[standard]"
安装 FastAPI 时,它会包含 standard
组的可选依赖项:
由 Pydantic 使用:
email-validator
- 用于电子邮件验证。
由 Starlette 使用:
httpx
- 如果你想使用TestClient
,则需要此依赖项。jinja2
- 如果你想使用默认的模板配置,则需要此依赖项。python-multipart
- 如果你想支持表单 "解析",使用request.form()
,则需要此依赖项。
由 FastAPI / Starlette 使用:
uvicorn
- 用于加载和提供你的应用程序的服务器。这包括uvicorn[standard]
,它包含一些依赖项(例如uvloop
),用于高性能服务。fastapi-cli
- 提供fastapi
命令。
不带 standard
依赖项¶
如果你不想包含 standard
可选依赖项,可以使用 pip install fastapi
而不是 pip install "fastapi[standard]"
进行安装。
其他可选依赖项¶
你可能想要安装一些额外的依赖项。
Pydantic 的额外可选依赖项:
pydantic-settings
- 用于设置管理。pydantic-extra-types
- 用于与 Pydantic 一起使用的额外类型。
FastAPI 的额外可选依赖项:
许可证¶
本项目采用 MIT 许可证。