特性¶
FastAPI 特性¶
FastAPI 为你提供以下功能
基于开放标准¶
- 用于 API 创建的 OpenAPI,包括对 路径 操作、参数、请求体、安全性等的声明。
- 使用 JSON Schema 自动生成数据模型文档(因为 OpenAPI 本身就是基于 JSON Schema 的)。
- 在经过严谨研究后围绕这些标准进行设计,而不是事后再添加的层。
- 这也允许在多种语言中使用自动 客户端代码生成。
自动文档¶
交互式 API 文档和探索 Web 用户界面。由于框架基于 OpenAPI,因此有多种选项,默认包含 2 种。
- Swagger UI,支持交互式探索,可直接从浏览器调用和测试你的 API。

- 使用 ReDoc 的替代 API 文档。

纯粹的现代 Python¶
这一切都基于标准的 Python 类型 声明(得益于 Pydantic)。无需学习新的语法,只需使用标准的现代 Python。
如果你需要 2 分钟复习如何使用 Python 类型(即使你不使用 FastAPI),请查看简短教程:Python 类型。
你编写带有类型的标准 Python 代码
from datetime import date
from pydantic import BaseModel
# Declare a variable as a str
# and get editor support inside the function
def main(user_id: str):
return user_id
# A Pydantic model
class User(BaseModel):
id: int
name: str
joined: date
它们可以像这样被使用
my_user: User = User(id=3, name="John Doe", joined="2018-07-19")
second_user_data = {
"id": 4,
"name": "Mary",
"joined": "2018-11-30",
}
my_second_user: User = User(**second_user_data)
信息
**second_user_data 意味着
将 second_user_data 字典的键和值直接作为键值参数传递,等同于:User(id=4, name="Mary", joined="2018-11-30")
编辑器支持¶
整个框架旨在易于使用且直观,所有的决策甚至在开发开始前就在多个编辑器上进行了测试,以确保最佳的开发体验。
在 Python 开发者调查中,显而易见 最常用的功能之一是“自动补全”。
整个 FastAPI 框架的基础就是为了满足这一点。自动补全在任何地方都适用。
你几乎不需要回看文档。
以下是编辑器如何帮助你

- 在 PyCharm 中

你将获得在以前认为不可能的代码中获得补全。例如,来自请求的 JSON 体(可能是嵌套的)内的 price 键。
不再需要因为输入错误的键名、反复查看文档、或上下滚动查找到底是用了 username 还是 user_name 而烦恼。
简短¶
它为一切提供了合理的 默认值,并随处提供可选配置。所有的参数都可以精细调整,以实现你所需的功能并定义你需要的 API。
但默认情况下,它一切都 “开箱即用”。
数据验证¶
-
为大多数(或所有?)Python 数据类型 提供验证,包括
- JSON 对象 (
dict)。 - 定义项类型的 JSON 数组 (
list)。 - 定义最小和最大长度的字符串 (
str) 字段。 - 具有最小和最大值的数字 (
int,float) 等。
- JSON 对象 (
-
对更特殊类型的验证,例如
- URL。
- Email。
- UUID。
- ...以及其他。
所有的验证均由成熟且健壮的 Pydantic 处理。
安全与认证¶
集成了安全和认证功能。无需在数据库或数据模型上做出任何妥协。
OpenAPI 中定义的所有安全方案,包括
- HTTP Basic 认证。
- OAuth2(包括 JWT 令牌)。查看关于 OAuth2 与 JWT 的教程。
- API 密钥在
- 请求头。
- 查询参数中。
- Cookie 中等。
加上 Starlette 的所有安全特性(包括 会话 Cookie)。
所有这些都构建为可复用的工具和组件,易于与你的系统、数据存储、关系型和 NoSQL 数据库等集成。
依赖注入¶
FastAPI 包含一个极其易于使用但功能强大的 依赖注入 系统。
- 即使依赖项也可以有依赖项,从而创建一个层级结构或 “依赖图”。
- 一切由框架 自动处理。
- 所有的依赖项都可以从请求中获取数据,并 增强路径操作 的约束和自动文档。
- 即使是依赖项中定义的 路径操作 参数也会进行 自动验证。
- 支持复杂的身份验证系统、数据库连接 等。
- 不对 数据库、前端等做出妥协。但可以轻松与它们中的任何一个集成。
无限的“插件”¶
换句话说,根本不需要插件,导入并使用你需要的代码即可。
任何集成都被设计为使用起来非常简单(通过依赖注入),以至于你可以使用与 路径操作 相同的结构和语法,在两行代码内为你的应用程序创建一个“插件”。
经过测试¶
- 100% 测试覆盖率。
- 100% 类型注解 代码库。
- 已在生产环境应用程序中使用。
Starlette 特性¶
FastAPI 与 Starlette 完全兼容(并基于它构建)。因此,你拥有的任何额外的 Starlette 代码也将正常工作。
FastAPI 实际上是 Starlette 的子类。因此,如果你已经了解或使用过 Starlette,大部分功能的工作方式是一样的。
使用 FastAPI,你可以获得 Starlette 的所有特性(因为 FastAPI 就是强化版的 Starlette)
- 极其令人印象深刻的性能。它是 现有的最快的 Python 框架之一,与 NodeJS 和 Go 不相上下。
- WebSocket 支持。
- 进程内后台任务。
- 启动和关闭事件。
- 基于 HTTPX 构建的测试客户端。
- CORS、GZip、静态文件、流式响应。
- 会话和 Cookie 支持。
- 100% 测试覆盖率。
- 100% 类型注解的代码库。
Pydantic 特性¶
FastAPI 与 Pydantic 完全兼容(并基于它构建)。因此,你拥有的任何额外的 Pydantic 代码也将正常工作。
包括同样基于 Pydantic 的外部库,如用于数据库的 ORM、ODM。
这也意味着在许多情况下,你可以直接将从请求中获取的对象 传给数据库,因为一切都已自动验证。
反之亦然,在许多情况下,你只需将从数据库获取的对象 直接传给客户端 即可。
使用 FastAPI,你可以获得 Pydantic 的所有特性(因为 FastAPI 在数据处理方面完全依赖 Pydantic)
- 没有让人困惑的地方:
- 无需学习新的模式定义微语言。
- 如果你了解 Python 类型,你就知道如何使用 Pydantic。
- 与你的 IDE/静态检查工具/大脑 配合良好
- 因为 Pydantic 数据结构只是你定义的类的实例;自动补全、静态检查、mypy 和你的直觉都应该能够正确处理你的已验证数据。
- 验证 复杂结构
- 使用分层 Pydantic 模型、Python
typing的List和Dict等。 - 验证器允许复杂的数据模式能够清晰且容易地被定义、检查并作为 JSON Schema 文档化。
- 你可以拥有深度 嵌套的 JSON 对象,并使它们全部被验证和标注。
- 使用分层 Pydantic 模型、Python
- 可扩展:
- Pydantic 允许定义自定义数据类型,或者你可以通过使用 validator 装饰器装饰模型上的方法来扩展验证。
- 100% 测试覆盖率。