FastAPI 框架,高性能、易学、快速编码、可随时投入生产
文档: https://fastapi.tiangolo.com
源代码: https://github.com/fastapi/fastapi
FastAPI is a modern, fast (high-performance), web framework for building 蜜蜂属 with Python based on standard Python type hints.
主要特点是:
- Fast:非常高性能,与 节点JS and Go (感谢 Starlette 和 Pydantic)。One of the fastest Python frameworks available.
- 快速编码:将特征开发速度提高约 200% 至 300%。*
- 更少的错误:减少约 40% 的人为(开发人员)引起的错误。*
- 直觉的: Great editor support. Completion everywhere. Less time debugging.
- Easy:设计为易于使用和学习。减少阅读文档的时间。
- 短:最大限度地减少代码重复。每个参数声明中的多个特征。更少的错误。
- 强大的:获取生产就绪代码。具有自动交互式文档。
- 基于标准:基于(并完全兼容)API 的开放标准: OpenAPI (previously known as Swagger) and JSON Schema.
* estimation based on tests on an internal development team, building production applications.
赞助商 { #sponsors }
意见 { #opinions }
“[…]我正在使用 FastAPI 这些天很多。[…]实际上,我计划将它用于我团队的所有Microsoft 的 ML 服务.其中一些正在融入核心 窗户 产品和一些办公室 产品。”
“我们采用了 FastAPI 库生成一个休息 可查询获取的服务器预测.[给路德维希]”
“Netflix 很高兴地宣布我们的开源版本危机管理 编排框架:Dispatch![内置 FastAPI]”
“我对此感到欣喜若狂 FastAPI.太有趣了!”
“老实说,你构建的东西看起来超级坚固和抛光。在很多方面,这都是我想要的 Hug 成为 - 看到有人建立它真的很鼓舞人心。”
“如果你想学习一个 现代框架 要构建 REST API,请查看FastAPI […]它快速、易于使用且易于学习 […]”
“我们已切换到 FastAPI 对于我们的APIs […]我想你会喜欢它 […]”
“如果有人想要构建生产 Python API,我强烈推荐 FastAPI.是的 设计精美, 使用简单 and 高度可扩展,它已经成为一个 关键部件 在我们的 API 优先开发战略中,并正在推动许多自动化和服务,例如我们的虚拟 TAC 工程师。”
Typer,CLI 的 FastAPI { #typer-the-fastapi-of-clis }
If you are building a CLI app to be used in the terminal 而不是a web API, check out Typer.
Typer 是 FastAPI 的小兄弟。它旨在成为CLI 的 FastAPI. ⌨️ 🚀
要求 { #requirements }
FastAPI 站在巨人的肩膀上:
安装 { #installation }
创建并激活 virtual environment 然后安装 FastAPI:
123 $ pip install "fastapi[standard]" ---> 100%
注意:确保你把 "fastapi[standard]" 在引号中以确保它在所有终端中都有效。
示例 { #example }
创建它 { #create-it }
创建文件 main.py 跟:
123456789101112131415 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}
Or use async def...
如果您的代码使用 async / await用 async def:
123456789101112131415 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}
Note:
如果您不知道,请检查 “着急吗?” 关于async and await in the docs.
运行它 { #run-it }
使用以下命令运行服务器:
1234567891011121314151617181920 $ 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 WatchFilesINFO: 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 docs.
检查一下 { #check-it }
打开浏览器 http://127.0.0.1:8000/items/5?q=somequery.
您将看到 JSON 响应,如下所示:
1 {"item_id": 5, "q": "somequery"}
您已经创建了一个 API,该 API:
- 在 路径s
/and/items/{item_id}. - 双 路径 拿
GET操作 (也称为 HTTP_方法_). - The path
/items/{item_id}有一个_路径参数_item_id那应该是一个int. - The path
/items/{item_id}有一个可选的str查询参数q.
交互式 API 文档 { #interactive-api-docs }
现在转到 http://127.0.0.1:8000/docs.
您将看到自动交互式 API 文档(由 Swagger UI):

替代 API 文档 { #alternative-api-docs }
现在,转到 http://127.0.0.1:8000/redoc.
您将看到替代的自动文档(由 ReDoc):

示例升级 { #example-upgrade }
现在修改文件 main.py 从一个PUT 请求。
使用标准 Python 类型声明正文,这要归功于 Pydantic。
123456789101112131415161718192021222324252627 from typing import Union from fastapi import FastAPIfrom 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}
The fastapi dev 服务器应自动重新加载。
交互式 API 文档升级 { #interactive-api-docs-upgrade }
Now go to http://127.0.0.1:8000/docs.
- 交互式 API 文档将自动更新,包括新的正文:

- Click on the button “Try it out”, it allows you to fill the 参数 and directly interact with the API:

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

替代 API 文档升级 { #alternative-api-docs-upgrade }
And now, go to http://127.0.0.1:8000/redoc.
- 替代文档还将反映新的查询参数和正文:

回顾 { #recap }
总之,你声明 一次 参数、体等的类型作为函数参数。
您可以使用标准的现代 Python 类型来做到这一点。
You don’t have to learn a new syntax, the methods 或者 classes of a specific library, etc.
只是标准 Python.
例如,对于 int:
1 item_id: int
或对于更复杂的 Item 模型:
1 item: Item
…通过该单个声明,您可以获得:
- 编辑器支持,包括:
- 完成。
- 类型检查。
- 数据验证:
- 数据无效时自动清除错误。
- 甚至对深度嵌套的 JSON 对象进行验证。
- Conversion of input data: coming from the network to Python data and types. Reading from:
- JSON的。
- 路径参数。
- 查询参数。
- 饼干。
- 头。
- 形式。
- 文件。
- Conversion of output data: converting from Python data and types to network data (as JSON):
- 转换 Python 类型 (
str,int,float,bool,list等)。 datetime对象。UUIDobjects.- 数据库模型。
- …还有很多。
- 转换 Python 类型 (
- 自动交互式 API 文档,包括 2 个替代用户界面:
- Swagger 用户界面。
- 重新文档。
回到前面的代码示例, FastAPI 将:
- 验证是否存在
item_id在路径中GETandPUT请求。 - 验证
item_id是类型intforGETandPUT请求。- 如果不是,客户端将看到一个有用的、明确的错误。
- 检查是否有名为
q(如http://127.0.0.1:8000/items/foo?q=somequery) 表示GETrequests.- 作为
q参数使用= None,它是可选的。 - 如果没有
None它将是必需的(就像PUT).
- 作为
- For
PUT请求/items/{item_id},将正文读取为 JSON:- 检查它是否具有必需属性
name这应该是一个str. - Check that it has a required attribute
price那必须是一个float. - 检查它是否具有可选属性
is_offer,这应该是一个bool,如果存在。 - 所有这些也适用于深度嵌套的 JSON 对象。
- 检查它是否具有必需属性
- 自动从 JSON 转换和转换为 JSON。
- 使用 OpenAPI 记录所有内容,可供:
- 交互式文档系统。
- 自动客户端代码生成系统,适用于多种语言。
- 直接提供 2 个交互式文档 Web 界面。
我们只是触及了表面,但您已经了解了这一切是如何运作的。
尝试使用以下方式更改线路:
1 return {"item_name": item.name, "item_id": item_id}
…从:
1 ... "item_name": item.name ...
…自:
1 ... "item_price": item.price ...
…并查看编辑器将如何自动完成属性并了解其类型:

有关包含更多功能的更完整示例,请参阅 Tutorial - User Guide.
剧透警告:教程 - 用户指南包括:
- 声明 parameters 来自其他不同的地方:头, 饼干, 表单字段 and files.
- 如何设置 验证约束 as
maximum_lengthorregex. - 一个非常强大且易于使用的 Dependency Injection 系统。
- 安全和身份验证,包括对 OAuth2 with JWT 代币 and HTTP 基础 认证。
- 更高级(但同样简单)的声明技术 深度嵌套的 JSON 模型 (感谢 Pydantic)。
- 图形QL 集成Strawberry 和其他图书馆。
- 许多额外的功能(感谢 Starlette),例如:
- Web套接字
- 基于 HTTPX 和
pytest - CORS
- Cookie 会话
- …和更多。
性能 { #performance }
**的 TechEmpower 基准测试显示 FastAPI 在 Uvicorn 下运行的应用程序作为one of the fastest Python frameworks available,仅低于 Starlette 和 Uvicorn 本身(由 FastAPI 内部使用)。(*)
要了解更多信息,请参阅部分 Benchmarks.
依赖项 { #dependencies }
FastAPI 依赖于 Pydantic 和 Starlette。
standard 依赖项 { #standard-dependencies }
当您使用 pip install "fastapi[standard]" 它带有standard 可选依赖项组:
Pydantic 使用:
email-validator- 用于电子邮件验证。
Starlette 使用:
httpx- 如果您想使用theTestClient.jinja2- 如果要使用默认模板配置,则为必填项。python-multipart- Required if you want to support form “parsing”, withrequest.form().
FastAPI 使用:
uvicorn- for the server that loads and serves your application. 这包括uvicorn[standard],其中包括一些依赖项(例如uvloop)是高性能服务所必需的。fastapi-cli[standard]- 提供fastapi命令。- This includes
fastapi-cloud-cli,它允许您将 FastAPI 应用程序部署到 FastAPI Cloud.
- This includes
没有 standard 依赖项 { #without-standard-dependencies }
如果您不想包含 standard optional dependencies,您可以使用 pip install fastapi instead of pip install "fastapi[standard]".
Without fastapi-cloud-cli { #without-fastapi-cloud-cli }
如果您想安装具有标准依赖项但不使用 fastapi-cloud-cli, you can install with pip install "fastapi[standard-no-fastapi-cloud-cli]".
其他可选依赖项 { #additional-optional-dependencies }
您可能想要安装一些其他依赖项。
其他可选的 Pydantic 依赖项:
pydantic-settings- 用于设置管理。pydantic-extra-types- 用于与 Pydantic 一起使用的额外类型。
其他可选的 FastAPI 依赖项:
orjson- Required if you want to useORJSONResponse.ujson- Required if you want to useUJSONResponse.
许可证 { #license }
该项目根据 MIT 许可证的条款获得许可。
免责声明 © 2025 - 虚宝阁
本站部分源码来源于网络,版权归属原开发者,用户仅获得使用权。依据《计算机软件保护条例》第十六条,禁止:
- 逆向工程破解技术保护措施
- 未经许可的分发行为
- 去除源码中的原始版权标识
※ 本站源码仅用于学习和研究,禁止用于商业用途。如有侵权, 请及时联系我们进行处理。











