跳至内容

特性

FastAPI 特性

FastAPI 为您提供以下内容

基于开放标准

  • OpenAPI 用于 API 创建,包括 路径 操作、参数、请求体、安全等声明。
  • 使用 JSON Schema(因为 OpenAPI 本身基于 JSON Schema)自动生成数据模型文档。
  • 在经过仔细研究后,围绕这些标准进行设计。而不是在顶部添加事后想法的层。
  • 这也允许在多种语言中使用自动客户端代码生成

自动文档

交互式 API 文档和探索 Web 用户界面。由于框架基于 OpenAPI,因此有多种选项,默认情况下包含 2 个。

  • Swagger UI,通过交互式探索,直接从浏览器调用和测试您的 API。

Swagger UI interaction

  • 使用 ReDoc 生成备选 API 文档。

ReDoc

仅使用现代 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 框架都是为了满足这一点而设计的。自动完成功能无处不在。

您很少需要返回文档。

以下是您的编辑器如何帮助您

editor support

editor support

您将在可能之前认为不可能的代码中获得代码补全。例如,来自请求的 JSON 主体(可能是嵌套的)内的 price 键。

不再需要键入错误的键名,在文档之间来回切换,或上下滚动以查找您最终使用了 username 还是 user_name

简洁

它为所有内容提供了合理的默认值,并且在任何地方都提供可选配置。所有参数都可以微调以满足您的需求并定义您所需的 API。

但默认情况下,所有内容“都能正常工作”

验证

  • 对大多数(或全部?)Python 数据类型进行验证,包括

    • JSON 对象 (dict)。
    • 定义项目类型的 JSON 数组 (list)。
    • 字符串 (str) 字段,定义最小和最大长度。
    • 数字 (intfloat),带最小和最大值等。
  • 针对更复杂的类型进行验证,例如

    • 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 的外部库,例如数据库的 ORMODM

这也意味着,在许多情况下,您可以将从请求中获得的相同对象 **直接传递给数据库**,因为所有内容都已自动验证。

反之亦然,在许多情况下,您可以将从数据库中获得的对象 **直接传递给客户端**。

使用 **FastAPI**,您将获得 **Pydantic** 的所有功能(因为 FastAPI 基于 Pydantic 处理所有数据)。

  • 没有令人费解的东西:
    • 无需学习新的模式定义微语言。
    • 如果您了解 Python 类型,您就知道如何使用 Pydantic。
  • 与您的 **IDE/代码检查工具/大脑** 完美配合
    • 因为 pydantic 数据结构只是您定义的类的实例;自动完成、代码检查、mypy 和您的直觉都应该与您的验证数据一起正常工作。
  • 验证 **复杂结构**
    • 使用分层 Pydantic 模型、Python typingListDict 等。
    • 并且验证器允许清晰且轻松地定义、检查和记录复杂的数 据模式作为 JSON 模式。
    • 您可以拥有深度 **嵌套的 JSON** 对象,并将其全部验证和注释。
  • 可扩展:
    • Pydantic 允许定义自定义数据类型,或者您可以使用用验证器装饰器装饰的模型上的方法扩展验证。
  • 100% 测试覆盖率。