FastAPI¶
FastAPI 框架,高性能,易于学习,快速开发,可用于生产环境
源代码: https://github.com/fastapi/fastapi
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于使用基于标准 Python 类型提示的 Python 构建 API。
主要特点是
- 快速:性能非常高,与 NodeJS 和 Go 相当(得益于 Starlette 和 Pydantic)。是最快的 Python 框架之一。
- 快速开发:将开发功能的速度提高约 200% 到 300%。*
- 更少的错误:减少约 40% 的人为(开发人员)错误。*
- 直观:出色的编辑器支持。补全无处不在。减少调试时间。
- 简单:设计易于使用和学习。减少阅读文档的时间。
- 简洁:最小化代码重复。每次参数声明都具有多种功能。减少错误。
- 健壮:获得生产就绪的代码。带有自动交互式文档。
- 基于标准:基于(并完全兼容)API 的开放标准:OpenAPI(以前称为 Swagger)和JSON Schema。
* 基于内部开发团队构建生产应用程序的测试估算。
赞助商¶
首席赞助商¶
金牌和银牌赞助商¶
评价¶
"[...] 我最近大量使用 FastAPI。 [...] 我实际上计划在我的团队所有 Microsoft 的 ML 服务中都使用它。其中一些正在集成到核心 Windows 产品和一些 Office 产品中。"
"我们采用了 FastAPI 库来启动一个可以查询以获取预测的REST服务器。[为 Ludwig]"
"Netflix 很高兴宣布开源我们的危机管理编排框架:Dispatch![使用FastAPI构建]"
"我对 FastAPI 感到无比兴奋。它太有趣了!"
"老实说,你构建的东西看起来非常坚固且完善。在很多方面,它就是我想要的 Hug 的样子 - 看到有人构建出它真的很有启发性。"
"如果您想学习一个用于构建 REST API 的现代框架,请查看FastAPI [...] 它快速、易于使用且易于学习 [...]"
"我们已经切换到 FastAPI 来构建我们的API [...] 我认为您会喜欢的 [...]"
"如果您正在寻找构建生产级 Python API 的方法,我强烈推荐 FastAPI。它设计精美,简单易用且高度可扩展,已成为我们 API 优先开发策略的关键组成部分,并驱动着许多自动化和服务,例如我们的虚拟 TAC 工程师。"
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}
注意:
如果您不确定,请查看文档中关于async 和 await 的“匆忙中?”部分。
运行它¶
使用以下命令运行服务器
$ 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 提供)

备选 API 文档¶
现在,访问 http://127.0.0.1:8000/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 文档将自动更新,包括新的请求体

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

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

替代 API 文档升级¶
现在,访问 http://127.0.0.1:8000/redoc。
- 替代文档也将反映新的查询参数和请求体

总结¶
总而言之,您只需声明一次参数、请求体等的类型作为函数参数。
您可以使用标准的现代 Python 类型来完成此操作。
您不必学习新的语法、特定库的方法或类等。
只是标准的 Python。
例如,对于一个 int
item_id: int
或者对于一个更复杂的 Item 模型
item: Item
...并且通过这单个声明,您将获得
- 编辑器支持,包括
- 补全。
- 类型检查。
- 数据验证
- 数据无效时自动生成清晰的错误。
- 甚至对深度嵌套的 JSON 对象进行验证。
- 转换输入数据:从网络到 Python 数据和类型。读取自
- JSON。
- 路径参数。
- 查询参数。
- Cookies。
- 请求头。
- 表单。
- 文件。
- 转换输出数据:将 Python 数据和类型转换为网络数据(如 JSON)
- 转换 Python 类型(
str,int,float,bool,list等)。 datetime对象。UUID对象。- 数据库模型。
- ……还有更多。
- 转换 Python 类型(
- 自动交互式 API 文档,包括 2 种替代用户界面
- Swagger UI。
- ReDoc。
回到之前的代码示例,FastAPI 将
- 验证
GET和PUT请求的路径中是否存在item_id。 - 验证
GET和PUT请求的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 ...
...并查看您的编辑器将如何自动补全属性并了解它们的类型

有关包含更多功能的更完整示例,请参阅教程 - 用户指南。
剧透警告:教程 - 用户指南包括
- 从其他不同位置声明参数,例如:请求头、Cookies、表单字段和文件。
- 如何设置验证约束,如
maximum_length或regex。 - 一个非常强大且易于使用的依赖注入系统。
- 安全和身份验证,包括对带有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 Cloud 由 FastAPI 背后的同一作者和团队构建。
它以最小的努力简化了 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 使用的
email-validator- 用于电子邮件验证。
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 依赖项
pydantic-settings- 用于设置管理。pydantic-extra-types- 用于 Pydantic 的额外类型。
额外的可选 FastAPI 依赖项
许可证¶
本项目根据 MIT 许可条款授权。














