特性¶
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
# 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 令牌)。请查看关于使用 JWT 的 OAuth2 的教程。
- API 密钥位于
- 请求头。
- 查询参数中。
- Cookie 等。
加上 Starlette 的所有安全功能(包括会话 cookie)。
所有功能都构建为可重用的工具和组件,易于与您的系统、数据存储、关系型和 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 数据结构只是您定义的类的实例;自动补全、代码检查、mypy 和您的直觉都应该能与您校验过的数据正常工作。
- 校验复杂结构
- 使用分层的 Pydantic 模型、Python
typing的List和Dict等。 - 校验器允许将复杂的数据模式清晰、轻松地定义、检查并以 JSON Schema 的形式记录。
- 您可以拥有深度嵌套的 JSON 对象,并让它们全部得到校验和注解。
- 使用分层的 Pydantic 模型、Python
- 可扩展:
- Pydantic 允许定义自定义数据类型,或者您可以使用带有 validator 装饰器的方法来扩展模型的校验功能。
- 100% 测试覆盖率。