跳到内容

FastAPI

FastAPI

FastAPI 框架,高性能,易于学习,快速开发,可用于生产环境

Test Coverage Package version Supported Python versions


文档https://fastapi.org.cn

源代码https://github.com/fastapi/fastapi


FastAPI 是一个现代、快速(高性能)的 Web 框架,用于使用基于标准 Python 类型提示的 Python 构建 API。

主要特点是

  • 快速:性能非常高,与 NodeJSGo 相当(得益于 Starlette 和 Pydantic)。是最快的 Python 框架之一
  • 快速开发:将开发功能的速度提高约 200% 到 300%。*
  • 更少的错误:减少约 40% 的人为(开发人员)错误。*
  • 直观:出色的编辑器支持。补全无处不在。减少调试时间。
  • 简单:设计易于使用和学习。减少阅读文档的时间。
  • 简洁:最小化代码重复。每次参数声明都具有多种功能。减少错误。
  • 健壮:获得生产就绪的代码。带有自动交互式文档。
  • 基于标准:基于(并完全兼容)API 的开放标准:OpenAPI(以前称为 Swagger)和JSON Schema

* 基于内部开发团队构建生产应用程序的测试估算。

赞助商

首席赞助商

金牌和银牌赞助商

其他赞助商

评价

"[...] 我最近大量使用 FastAPI。 [...] 我实际上计划在我的团队所有 Microsoft 的 ML 服务中都使用它。其中一些正在集成到核心 Windows 产品和一些 Office 产品中。"

Kabir Khan - Microsoft (参考)

"我们采用了 FastAPI 库来启动一个可以查询以获取预测REST服务器。[为 Ludwig]"

Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber (参考)

"Netflix 很高兴宣布开源我们的危机管理编排框架:Dispatch![使用FastAPI构建]"

Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (参考)

"我对 FastAPI 感到无比兴奋。它太有趣了!"

Brian Okken - Python Bytes 播客主持人 (参考)

"老实说,你构建的东西看起来非常坚固且完善。在很多方面,它就是我想要的 Hug 的样子 - 看到有人构建出它真的很有启发性。"

Timothy Crosley - Hug 创建者 (参考)

"如果您想学习一个用于构建 REST API 的现代框架,请查看FastAPI [...] 它快速、易于使用且易于学习 [...]"

"我们已经切换到 FastAPI 来构建我们的API [...] 我认为您会喜欢的 [...]"

Ines Montani - Matthew Honnibal - Explosion AI 创始人 - spaCy 创建者 (参考) - (参考)

"如果您正在寻找构建生产级 Python API 的方法,我强烈推荐 FastAPI。它设计精美简单易用高度可扩展,已成为我们 API 优先开发策略的关键组成部分,并驱动着许多自动化和服务,例如我们的虚拟 TAC 工程师。"

Deon Pillsbury - Cisco (参考)

Typer,CLIs 的 FastAPI

如果您正在构建一个用于在终端中使用的 CLI 应用程序而不是 Web API,请查看Typer

Typer 是 FastAPI 的“小兄弟”。它的目标是成为CLIs 的 FastAPI。 ⌨️ 🚀

要求

FastAPI 站在巨人的肩膀上

安装

创建并激活一个虚拟环境,然后安装 FastAPI

$ pip install "fastapi[standard]"

---> 100%

注意:请确保将 "fastapi[standard]" 放在引号中,以确保它在所有终端中都能正常工作。

示例

创建它

创建一个名为 main.py 的文件,其中包含

from typing import Union

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}
或者使用 async def...

如果您的代码使用 async / await,请使用 async def

from typing import Union

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}

注意:

如果您不确定,请查看文档中关于asyncawait 的“匆忙中?”部分

运行它

使用以下命令运行服务器

$ fastapi dev main.py

 ╭────────── FastAPI CLI - Development mode ───────────╮
 │                                                     │
 │  Serving at: http://127.0.0.1:8000                  │
 │                                                     │
 │  API docs: http://127.0.0.1:8000/docs               │
 │                                                     │
 │  Running in development mode, for production use:   │
 │                                                     │
 │  fastapi run                                        │
 │                                                     │
 ╰─────────────────────────────────────────────────────╯

INFO:     Will watch for changes in these directories: ['/home/user/code/awesomeapp']
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [2248755] using WatchFiles
INFO:     Started server process [2248757]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
关于命令 fastapi dev main.py...

fastapi dev 命令会读取您的 main.py 文件,检测其中的 FastAPI 应用,并使用Uvicorn启动一个服务器。

默认情况下,fastapi dev 将启用自动重载进行本地开发。

您可以在FastAPI CLI 文档中阅读更多关于它的内容。

检查一下

在浏览器中打开 http://127.0.0.1:8000/items/5?q=somequery

您将看到 JSON 响应如下

{"item_id": 5, "q": "somequery"}

您已经创建了一个 API,该 API

  • 路径 //items/{item_id} 接收 HTTP 请求。
  • 这两个路径都接受 GET操作(也称为 HTTP方法)。
  • 路径 /items/{item_id} 有一个路径参数 item_id,它应该是一个 int
  • 路径 /items/{item_id} 有一个可选的 str查询参数 q

交互式 API 文档

现在访问 http://127.0.0.1:8000/docs

您将看到自动交互式 API 文档(由 Swagger UI 提供)

Swagger UI

备选 API 文档

现在,访问 http://127.0.0.1:8000/redoc

您将看到备选的自动文档(由 ReDoc 提供)

ReDoc

示例升级

现在修改 main.py 文件以接收来自 PUT 请求的请求体。

使用标准的 Python 类型声明请求体,这要归功于 Pydantic。

from typing import Union

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: str
    price: float
    is_offer: Union[bool, None] = None


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}


@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
    return {"item_name": item.name, "item_id": item_id}

fastapi dev 服务器应自动重新加载。

交互式 API 文档升级

现在访问 http://127.0.0.1:8000/docs

  • 交互式 API 文档将自动更新,包括新的请求体

Swagger UI

  • 点击“Try it out”按钮,它允许您填写参数并直接与 API 交互

Swagger UI interaction

  • 然后点击“Execute”按钮,用户界面将与您的 API 通信,发送参数,获取结果并在屏幕上显示它们

Swagger UI interaction

替代 API 文档升级

现在,访问 http://127.0.0.1:8000/redoc

  • 替代文档也将反映新的查询参数和请求体

ReDoc

总结

总而言之,您只需声明一次参数、请求体等的类型作为函数参数。

您可以使用标准的现代 Python 类型来完成此操作。

您不必学习新的语法、特定库的方法或类等。

只是标准的 Python

例如,对于一个 int

item_id: int

或者对于一个更复杂的 Item 模型

item: Item

...并且通过这单个声明,您将获得

  • 编辑器支持,包括
    • 补全。
    • 类型检查。
  • 数据验证
    • 数据无效时自动生成清晰的错误。
    • 甚至对深度嵌套的 JSON 对象进行验证。
  • 转换输入数据:从网络到 Python 数据和类型。读取自
    • JSON。
    • 路径参数。
    • 查询参数。
    • Cookies。
    • 请求头。
    • 表单。
    • 文件。
  • 转换输出数据:将 Python 数据和类型转换为网络数据(如 JSON)
    • 转换 Python 类型(str, int, float, bool, list 等)。
    • datetime 对象。
    • UUID 对象。
    • 数据库模型。
    • ……还有更多。
  • 自动交互式 API 文档,包括 2 种替代用户界面
    • Swagger UI。
    • ReDoc。

回到之前的代码示例,FastAPI

  • 验证 GETPUT 请求的路径中是否存在 item_id
  • 验证 GETPUT 请求的 item_id 是否为 int 类型。
    • 如果不是,客户端将看到一个有用、清晰的错误。
  • 检查是否存在一个名为 q 的可选查询参数(如 http://127.0.0.1:8000/items/foo?q=somequery)用于 GET 请求。
    • 由于 q 参数声明为 = None,因此它是可选的。
    • 如果没有 None,它将是必需的(就像 PUT 情况下的请求体一样)。
  • 对于 PUT 请求到 /items/{item_id},将请求体读取为 JSON
    • 检查它是否有一个必需的属性 name,它应该是一个 str
    • 检查它是否有一个必需的属性 price,它必须是一个 float
    • 检查它是否有一个可选的属性 is_offer,如果存在,它应该是一个 bool
    • 所有这些也将适用于深度嵌套的 JSON 对象。
  • 自动在 JSON 之间进行转换。
  • 使用 OpenAPI 为所有内容生成文档,可以用于
    • 交互式文档系统。
    • 自动客户端代码生成系统,适用于多种语言。
  • 直接提供 2 个交互式文档 Web 界面。

我们才刚刚开始,但您已经可以了解它是如何工作的了。

尝试更改该行

    return {"item_name": item.name, "item_id": item_id}

...从

        ... "item_name": item.name ...

...到

        ... "item_price": item.price ...

...并查看您的编辑器将如何自动补全属性并了解它们的类型

editor support

有关包含更多功能的更完整示例,请参阅教程 - 用户指南

剧透警告:教程 - 用户指南包括

  • 从其他不同位置声明参数,例如:请求头Cookies表单字段文件
  • 如何设置验证约束,如 maximum_lengthregex
  • 一个非常强大且易于使用的依赖注入系统。
  • 安全和身份验证,包括对带有JWT 令牌HTTP Basic 身份验证的OAuth2 的支持。
  • 更高级(但同样简单)的声明深度嵌套 JSON 模型的技术(得益于 Pydantic)。
  • Strawberry和其他库的GraphQL集成。
  • 许多额外的功能(得益于 Starlette),例如
    • WebSockets
    • 基于 HTTPX 和 pytest 的极其简单的测试
    • CORS
    • Cookie 会话
    • ……还有更多。

部署您的应用程序(可选)

您可以选择将您的 FastAPI 应用程序部署到FastAPI Cloud,如果您还没有加入,请加入等待列表。 🚀

如果您已经拥有 FastAPI Cloud 帐户(我们从等待列表中邀请了您 😉),您可以使用一个命令部署您的应用程序。

部署前,请确保您已登录

$ fastapi login

You are logged in to FastAPI Cloud 🚀

然后部署您的应用程序

$ fastapi deploy

Deploying to FastAPI Cloud...

✅ Deployment successful!

🐔 Ready the chicken! Your app is ready at https://myapp.fastapicloud.dev

就是这样!现在你可以在那个 URL 访问你的应用了。✨

关于 FastAPI Cloud

FastAPI CloudFastAPI 背后的同一作者和团队构建。

它以最小的努力简化了 API 的构建部署访问过程。

它将使用 FastAPI 构建应用的开发者体验带到了将它们部署到云端的过程中。🎉

FastAPI Cloud 是 FastAPI 及其相关开源项目的主要赞助商和资金提供者。✨

部署到其他云服务提供商

FastAPI 是开源的并且基于标准。你可以将 FastAPI 应用部署到你选择的任何云服务提供商。

遵循你的云服务提供商的指南来部署 FastAPI 应用。🤓

性能

独立的 TechEmpower 基准测试显示,在 Uvicorn 下运行的 FastAPI 应用程序是最快的 Python 框架之一,仅次于 Starlette 和 Uvicorn 本身(FastAPI 内部使用)。 (*)

要更深入地了解,请参阅基准测试部分。

依赖项

FastAPI 依赖于 Pydantic 和 Starlette。

standard 依赖项

当您使用 pip install "fastapi[standard]" 安装 FastAPI 时,它附带 standard 组的可选依赖项

Pydantic 使用的

Starlette 使用的

  • httpx - 如果您想使用 TestClient,则需要此项。
  • jinja2 - 如果您想使用默认模板配置,则需要此项。
  • python-multipart - 如果您想支持表单“解析”,并使用 request.form(),则需要此项。

FastAPI 使用的

  • uvicorn - 用于加载和提供您应用程序的服务器。这包括 uvicorn[standard],它包含一些(例如 uvloop)高性能服务所需的依赖项。
  • fastapi-cli[standard] - 提供 fastapi 命令。
    • 这包括 fastapi-cloud-cli,它允许您将 FastAPI 应用程序部署到FastAPI Cloud

不带 standard 依赖项

如果您不想包含 standard 可选依赖项,您可以改用 pip install fastapi 而不是 pip install "fastapi[standard]" 来安装。

不带 fastapi-cloud-cli

如果您想安装 FastAPI 并包含标准依赖项,但不包含 fastapi-cloud-cli,您可以使用 pip install "fastapi[standard-no-fastapi-cloud-cli]" 来安装。

其他可选依赖项

有一些额外的依赖项您可能想安装。

额外的可选 Pydantic 依赖项

额外的可选 FastAPI 依赖项

  • orjson - 如果您想使用 ORJSONResponse,则需要此项。
  • ujson - 如果您想使用 UJSONResponse,则需要此项。

许可证

本项目根据 MIT 许可条款授权。