功能¶
FastAPI 功能¶
FastAPI 为您提供以下功能:
基于开放标准¶
- OpenAPI 用于 API 创建,包括 路径 操作、参数、请求体、安全等的声明。
- 使用 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
# 声明一个变量为 str
# 并在函数内部获得编辑器支持
def main(user_id: str):
return user_id
# 一个 Pydantic 模型
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)
Info
**second_user_data
意味着:
直接将 second_user_data
字典的键和值作为键值参数传递,相当于:User(id=4, name="Mary", joined="2018-11-30")
编辑器支持¶
整个框架设计为易于使用且直观,所有决策在开发开始前都经过多个编辑器的测试,以确保最佳的开发体验。
在 Python 开发者调查中,很明显“自动补全”是最常用的功能之一。
整个 FastAPI 框架的设计就是为了满足这一点。自动补全在任何地方都能工作。
您很少需要回到文档。
以下是您的编辑器如何帮助您:
- 在 Visual Studio Code 中:
- 在 PyCharm 中:
您将在以前甚至认为不可能的代码中获得补全。例如,来自请求的 JSON 主体(可能嵌套)中的 price
键。
不再输入错误的键名,不再在文档中来回切换,不再滚动查找您最终使用的到底是 username
还是 user_name
。
简洁¶
它为所有内容提供了合理的**默认值**,并提供了可选的配置。所有参数都可以微调以满足您的需求并定义您需要的 API。
但默认情况下,所有内容都**“正常工作”**。
验证¶
-
对大多数(或所有?)Python **数据类型**的验证,包括:
- JSON 对象(
dict
)。 - JSON 数组(
list
)定义项目类型。 - 字符串(
str
)字段,定义最小和最大长度。 - 数字(
int
、float
)带有最小和最大值等。
- JSON 对象(
-
对更多特殊类型的验证,如:
- URL。
- 电子邮件。
- UUID。
- ...以及其他。
所有验证都由经过良好测试且稳健的 Pydantic 处理。
安全和认证¶
集成安全和认证。不与数据库或数据模型妥协。
所有在 OpenAPI 中定义的安全方案,包括:
- HTTP Basic。
- OAuth2(也支持 JWT 令牌)。查看关于 OAuth2 与 JWT 的教程。
- API 密钥在:
- 头部信息。
- 查询参数。
- Cookies 等。
加上 Starlette 的所有安全特性(包括 会话 cookies)。
所有这些都构建为可重用的工具和组件,易于与您的系统、数据存储、关系型和 NoSQL 数据库等集成。
依赖注入¶
FastAPI 包含一个极其易用但功能极其强大的 依赖注入 系统。
- 即使是依赖项也可以有依赖项,创建依赖项的层次结构或 "依赖图"。
- 所有依赖项都由框架 自动处理。
- 所有依赖项都可以从请求中获取数据,并 增强路径操作 的约束和自动文档。
- 即使对于在依赖项中定义的 路径操作 参数,也进行 自动验证。
- 支持复杂的用户认证系统、数据库连接 等。
- 不妥协 于数据库、前端等。但易于与所有这些集成。
无限 "插件"¶
或者换句话说,不需要它们,只需导入并使用您需要的代码。
任何集成都设计得非常简单易用(通过依赖项),您可以使用与 路径操作 相同的结构和语法,在 2 行代码中为您的应用程序创建一个 "插件"。
经过测试¶
- 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/linter/大脑 配合良好:
- 因为 Pydantic 数据结构只是您定义的类的实例;自动补全、linting、mypy 和您的直觉应该都能与您的验证数据正常工作。
- 验证 复杂结构:
- 使用分层 Pydantic 模型、Python
typing
的List
和Dict
等。 - 验证器允许复杂的数据模式被清晰、轻松地定义、检查和记录为 JSON Schema。
- 您可以拥有深度 嵌套的 JSON 对象,并让它们全部被验证和注解。
- 使用分层 Pydantic 模型、Python
- 可扩展:
- Pydantic 允许定义自定义数据类型,或者您可以使用带有验证器装饰器的方法扩展验证。
- 100% 测试覆盖率。