特性¶
FastAPI 特性¶
FastAPI 为您提供以下内容
基于开放标准¶
- OpenAPI 用于 API 创建,包括 路径 操作、参数、请求体、安全等声明。
- 使用 JSON Schema(因为 OpenAPI 本身基于 JSON Schema)自动生成数据模型文档。
- 在经过仔细研究后,围绕这些标准进行设计。而不是在顶部添加事后想法的层。
- 这也允许在多种语言中使用自动客户端代码生成。
自动文档¶
交互式 API 文档和探索 Web 用户界面。由于框架基于 OpenAPI,因此有多种选项,默认情况下包含 2 个。
- 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
dict 的键和值作为键值参数传递,等效于: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 基本认证。
- **OAuth2**(也包括 **JWT 令牌**)。请查看关于 带 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/代码检查工具/大脑** 完美配合
- 因为 pydantic 数据结构只是您定义的类的实例;自动完成、代码检查、mypy 和您的直觉都应该与您的验证数据一起正常工作。
- 验证 **复杂结构**
- 使用分层 Pydantic 模型、Python
typing
的List
和Dict
等。 - 并且验证器允许清晰且轻松地定义、检查和记录复杂的数 据模式作为 JSON 模式。
- 您可以拥有深度 **嵌套的 JSON** 对象,并将其全部验证和注释。
- 使用分层 Pydantic 模型、Python
- 可扩展:
- Pydantic 允许定义自定义数据类型,或者您可以使用用验证器装饰器装饰的模型上的方法扩展验证。
- 100% 测试覆盖率。