特性¶
FastAPI 特性¶
FastAPI 提供以下特性:
基于开放标准¶
- OpenAPI 用于 API 创建,包括 路径 操作、参数、请求体、安全性等的声明。
- 使用 JSON Schema 自动生成数据模型文档(因为 OpenAPI 本身就是基于 JSON Schema 的)。
- 经过仔细研究,围绕这些标准进行设计。而非事后在顶层添加。
- 这也允许在多种语言中使用自动的 客户端代码生成。
自动文档¶
交互式 API 文档和探索性 Web 用户界面。由于该框架基于 OpenAPI,因此有多种选择,其中默认包含两种。
- Swagger UI,支持交互式探索,直接从浏览器调用和测试您的 API。
- 使用 ReDoc 的替代 API 文档。
纯粹的现代 Python¶
它完全基于标准的 Python 类型 声明(归功于 Pydantic)。无需学习新语法。就是标准的现代 Python。
如果您需要快速回顾如何使用 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。
- 电子邮件。
- UUID。
- ……以及其他。
所有校验均由成熟稳健的 Pydantic 处理。
安全与认证¶
安全和认证集成。不与数据库或数据模型妥协。
OpenAPI 中定义的所有安全方案,包括
- HTTP Basic。
- OAuth2(也支持 JWT token)。查看 使用 JWT 的 OAuth2 教程。
- 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/linter/大脑 完美配合
- 因为 Pydantic 数据结构只是您定义的类的实例;自动补全、代码检查(linting)、mypy 和您的直觉都应该与您校验过的数据正常工作。
- 校验复杂结构
- 使用分层的 Pydantic 模型、Python
typing
的List
和Dict
等。 - 校验器允许将复杂的数据模式清晰、轻松地定义、检查并以 JSON Schema 形式文档化。
- 您可以拥有深度嵌套的 JSON 对象,并对它们进行全部校验和注解。
- 使用分层的 Pydantic 模型、Python
- 可扩展:
- Pydantic 允许定义自定义数据类型,或者您可以通过模型上使用
validator
装饰器装饰的方法来扩展校验。
- Pydantic 允许定义自定义数据类型,或者您可以通过模型上使用
- 100% 测试覆盖率。