FastAPI易于学习快速编码的高性能框架

FastAPI 框架,高性能、易学、快速编码、可立即投入生产


Documentation: https://fastapi.tiangolo.com

Source Code: https://github.com/fastapi/fastapi


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

其主要特点如下:

  • 快速:性能极高,与 NodeJSGo 相当(得益于 Starlette 和 Pydantic)。目前最快的 Python 框架之一
  • 快速编码:功能开发速度提升约 200% 到 300%。*
  • 更少的 bug:减少约 40% 的人为(开发人员)错误。*
  • 直观:强大的编辑器支持。自动完成功能随处可见。减少调试时间。
  • 简单:设计易于使用和学习。减少阅读文档的时间。
  • 简短:最大限度地减少代码重复。每个参数声明即可实现多个功能。更少的错误。
  • 稳健:获取可用于生产环境的代码。并支持自动交互式文档。
  • 基于标准:基于(并完全兼容)API 的开放标准:OpenAPI(之前称为 Swagger)和 JSON Schema

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

观点

“[...] 我最近一直在使用 FastAPI。[...] 我实际上计划将它用于我团队在微软的所有 机器学习 服务。其中一些服务正在集成到核心 Windows 产品和一些 Office 产品中。”

Kabir Khan - 微软 (ref)

“我们采用了 FastAPI 库来生成一个 REST 服务器,可以通过查询该服务器来获取 预测。[致 Ludwig]”

Piero Molino、Yaroslav Dudin 和 Sai Sumanth Miryala - Uber (ref)

“Netflix 非常高兴地宣布开源我们的危机管理编排框架:Dispatch![基于 FastAPI 构建]”

Kevin Glisson、Marc Vilanova、Forest Monsen - Netflix (ref)

“我对 FastAPI 感到非常兴奋。它太好玩了!”

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

“_说实话,你构建的东西看起来超级扎实精致。从很多方面来说,它正是我想要的 Hug 的样子——看到有人能做出这样的作品,真的很鼓舞人心。”

Timothy Crosley - Hug 的创建者 (ref)

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

我们已经将 API 切换到 FastAPI [...] 我相信您会喜欢它 [...]

Ines Montani - Matthew Honnibal - Explosion AI 创始人 - spaCy创作者 (ref) - (ref)

“_如果有人想构建生产级 Python API,我强烈推荐 FastAPI。它设计精美易于使用高度可扩展,已成为我们 API 优先开发策略的关键组件,并正在驱动许多自动化和服务,例如我们的虚拟 TAC 工程师。”

Deon Pillsbury - 思科 (ref)

Typer,CLI 中的 FastAPI

如果您正在构建一个CLI应用,用于终端而非 Web API,请查看Typer

Typer 是 FastAPI 的小兄弟。它旨在成为CLI 中的 FastAPI。 ⌨️ 🚀

要求

FastAPI 站在巨人的肩膀上:

安装

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

控制台 复制代码
$ pip install "fastapi[standard]"

---> 100%

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

示例

创建示例

创建 main.py 文件,其中包含以下内容:

Python 复制代码
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

Python hl_lines="9 14" 复制代码
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的“急着用吗?”部分。

运行

使用以下命令运行服务器:

console 复制代码
$ 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 响应:

JSON 复制代码
{"item_id": 5, "q": "somequery"}

您已经创建了一个 API,它:

  • 接收路径 //items/{item_id} 中的 HTTP 请求。
  • 这两个路径都接受 GET 操作(也称为 HTTP 方法)。
  • path /items/{item_id} 有一个 _path 参数 item_id,该参数应为 int
  • path /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 的帮助。

Python hl_lines="4 9-12 25-27" 复制代码
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
  • 点击“试用”按钮,您可以填写参数并直接与 API 交互:
Swagger UI 交互
  • 然后点击“执行”按钮,用户界面将与您的 API 通信,发送参数,获取结果并将其显示在屏幕上:
Swagger UI 交互

备选 API 文档升级

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

  • 替代文档也将反映新的查询参数和主体:
ReDoc

回顾

总而言之,您只需一次将参数、主体等的类型声明为函数参数即可。

您可以使用标准的现代 Python 类型来做到这一点。

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

只需使用标准的Python即可。

例如,对于 int 类型:

Python 复制代码
item_id: int

或者对于更复杂的“Item”模型:

Python 复制代码
item: Item

...只需这一个声明,您就可以获得:

  • 编辑器支持,包括:
  • 补全。
  • 类型检查。
  • 数据验证:
  • 数据无效时自动清除错误。
  • 即使对于深度嵌套的 JSON 对象也能进行验证。
  • 输入数据转换:从网络数据转换为 Python 数据和类型。读取自:
  • JSON。
  • 路径参数。
  • 查询参数。
  • Cookie。
  • 标头。
  • 表单。
  • 文件。
  • 输出数据转换:从 Python 数据和类型转换为网络数据(以 JSON 格式):
  • 转换 Python 类型(strintfloatboollist 等)。
  • datetime 对象。
  • UUID 对象。
  • 数据库模型。
  • ...以及更多。
  • 自动生成交互式 API 文档,包含 2 个可选用户界面:
  • Swagger UI。
  • 重新文档。

回到前面的代码示例,FastAPI 将:

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

我们只是略知皮毛,但您已经大致了解它的工作原理了。

尝试将以下代码改为:

Python 复制代码
return {"item_name": item.name, "item_id": item_id}

...from:

Python 复制代码
... "item_name": item.name ...

...to:

Python 复制代码
... "item_price": item.price ...

...看看您的编辑器如何自动补全属性并识别它们的类型:

编辑器支持

如需查看包含更多功能的更完整示例,请参阅教程 - 用户指南

剧透警告:本教程 - 用户指南包含以下内容:

  • 如何在不同的位置声明参数,例如:headerscookies表单字段文件
  • 如何将验证约束设置为 maximum_lengthregex
  • 一个非常强大且易于使用的依赖注入系统。
  • 安全和身份验证,包括支持使用JWT 令牌OAuth2HTTP Basic身份验证。
  • 更高级(但同样简单)的深度嵌套 JSON 模型声明技术(感谢 Pydantic)。
  • GraphQLStrawberry 及其他库的集成。
  • 许多额外功能(感谢 Starlette)包括:
  • WebSockets
  • 基于 HTTPX 和 pytest 的极其简单的测试
  • CORS
  • Cookie Sessions
  • 等等。

性能

独立的 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-cloud-cli 的 FastAPI,可以使用 `pip install "fastapi[standard-no-fastapi-cloud-cli]" 进行安装。

其他可选依赖项

您可能需要安装一些其他依赖项。

其他可选的 Pydantic 依赖项:

其他可选的 FastAPI 依赖项:

  • orjson - 如果要使用 ORJSONResponse,则需要此依赖项。
  • ujson - 如果要使用 UJSONResponse,则必须使用。

许可证

本项目遵循 MIT 许可证。

关于项目

FastAPI 是一个现代的、快速的(高性能)Web 框架,用于基于标准 Python 类型提示构建 API。高性能,易于学习,快速编码,可立即投入生产。
MIT
Python
90,577
8021
721
2018-12-08
2025-10-10

增长趋势 - stars