fastapi: Python web api 框架

2025年09月16日 07:44:42
98799
webAPI python3.6 文档 standard FastAPI

项目结构

📌 fastapi fastapi/fastapi

一个基于 Python 3.6+ 版本的异步 WEB 应用框架,使用 Python 类型注解构建 web API 。主要特点有: 高性能:与 Node JS 和 Go 相当。 编码快:将开发功能的速度提高 2~3 倍。 Bug少:减少大约 40% 的由开发人员导致的错误。 直观:强大的编辑器支持,可智能感知和补全代码。 简单:易于学习和使用,减少文档阅读时间。 简短:尽量减少代码重复。 健壮:获得可用于生产的代码,具有自动交互文档。 基于标准:基于 OpenAPI 和 JSON Schema 。

项目大小
涉及语言 Python 99.94% JavaScript 0.03% Shell 0.02% HTML 0.01% CSS 0.00%
许可协议 MIT License

FastAPI

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

Test Coverage Package version Supported Python versions


文档: 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 }
















Other sponsors

意见 { #opinions }

[…]我正在使用 FastAPI 这些天很多。[…]实际上,我计划将它用于我团队的所有Microsoft 的 ML 服务.其中一些正在融入核心 窗户 产品和一些办公室 产品。

卡比尔汗 - Microsoft (ref)

我们采用了 FastAPI 库生成一个休息 可查询获取的服务器预测.[给路德维希]

皮耶罗·莫利诺、雅罗斯拉夫·杜丁和赛·苏曼斯·米里亚拉 - Uber (ref)

Netflix 很高兴地宣布我们的开源版本危机管理 编排框架:Dispatch![内置 FastAPI]

凯文·格利森、马克·维拉诺瓦、森林蒙特 - Netflix (ref)

我对此感到欣喜若狂 FastAPI.太有趣了!

布莱恩·奥肯 - Python Bytes podcast host (ref)

老实说,你构建的东西看起来超级坚固和抛光。在很多方面,这都是我想要的 Hug 成为 - 看到有人建立它真的很鼓舞人心。

蒂莫西·克罗斯利 - Hug creator (ref)

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

我们已切换到 FastAPI 对于我们的APIs […]我想你会喜欢它 […]

伊内斯·蒙塔尼 - 马修·洪尼拔 - Explosion AI founders - spaCy creators (ref) - (ref)

如果有人想要构建生产 Python API,我强烈推荐 FastAPI.是的 设计精美, 使用简单 and 高度可扩展,它已经成为一个 关键部件 在我们的 API 优先开发战略中,并正在推动许多自动化和服务,例如我们的虚拟 TAC 工程师。

德恩·皮尔斯伯里 - Cisco (ref)

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:

1
2
3
$ pip install "fastapi[standard]"
 
---> 100%

注意:确保你把 "fastapi[standard]" 在引号中以确保它在所有终端中都有效。

示例 { #example }

创建它 { #create-it }

创建文件 main.py 跟:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 / awaitasync def:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 }

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ fastapi dev main.py
 
 ╭────────── FastAPI CLI - Development mode ───────────╮
 │                                                     │
 │                                                     │
 │                                                     │
 │  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.
About the command 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):

Swagger UI

替代 API 文档 { #alternative-api-docs }

现在,转到 http://127.0.0.1:8000/redoc.

您将看到替代的自动文档(由 ReDoc):

ReDoc

示例升级 { #example-upgrade }

现在修改文件 main.py 从一个PUT 请求。

使用标准 Python 类型声明正文,这要归功于 Pydantic。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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}

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

交互式 API 文档升级 { #interactive-api-docs-upgrade }

Now go to http://127.0.0.1:8000/docs.

  • 交互式 API 文档将自动更新,包括新的正文:

Swagger UI

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

Swagger UI interaction

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

Swagger UI interaction

替代 API 文档升级 { #alternative-api-docs-upgrade }

And now, go to http://127.0.0.1:8000/redoc.

  • 替代文档还将反映新的查询参数和正文:

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 对象。
    • UUID objects.
    • 数据库模型。
    • …还有很多。
  • 自动交互式 API 文档,包括 2 个替代用户界面:
    • Swagger 用户界面。
    • 重新文档。

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

  • 验证是否存在 item_id 在路径中GET and PUT 请求。
  • 验证 item_id 是类型int for GET and PUT 请求。
    • 如果不是,客户端将看到一个有用的、明确的错误。
  • 检查是否有名为 q (如http://127.0.0.1:8000/items/foo?q=somequery) 表示 GET requests.
    • 作为 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 ...

…并查看编辑器将如何自动完成属性并了解其类型:

editor support

有关包含更多功能的更完整示例,请参阅 Tutorial - User Guide.

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

  • 声明 parameters 来自其他不同的地方:, 饼干, 表单字段 and files.
  • 如何设置 验证约束 as maximum_length or regex.
  • 一个非常强大且易于使用的 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 使用:

Starlette 使用:

  • httpx - 如果您想使用the TestClient.
  • jinja2 - 如果要使用默认模板配置,则为必填项。
  • python-multipart - Required if you want to support form “parsing”, with request.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.

没有 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 依赖项:

其他可选的 FastAPI 依赖项:

  • orjson - Required if you want to use ORJSONResponse.
  • ujson - Required if you want to use UJSONResponse.

许可证 { #license }

该项目根据 MIT 许可证的条款获得许可。

免责声明 © 2025 - 虚宝阁

本站部分源码来源于网络,版权归属原开发者,用户仅获得使用权。依据《计算机软件保护条例》第十六条,禁止:

  • 逆向工程破解技术保护措施
  • 未经许可的分发行为
  • 去除源码中的原始版权标识

※ 本站源码仅用于学习和研究,禁止用于商业用途。如有侵权, 请及时联系我们进行处理。

侵权举报请提供: 侵权页面URL | 权属证明模板

响应时效:收到完整材料后48小时内处理

相关推荐

Claudable:基于 Next.js 框架的网站生成器

把你用自然语言描述的应用想法,直接变成可以运行的网站代码。Claudable 背后依赖强大的 AI 编程助手,主要是 Claude Code,也支持 Cursor CLI 来理解你的需求并生成代码。你不需要懂复杂的 API 设置、数据库配置或者部署流程:用简单的语言告诉 Claudable 你想要什么应用。

2525 2025-09-15

pyscript: 直接在浏览器中用 Python 创建应用程序

在 HTML 文件中直接使用 Python 编程语言,像 JavaScript 文件一样引入和执行 Python 代码,支持更小的 MicroPython、常见第三方库和操作页面元素等功能,适用于快速创建交互的数据可视化、网站原型和在线教育等 Web 应用场景。

18589 2025-10-04

pydoll: 无需 WebDriver 的浏览器自动化 Python 库

用于自动化操作 Chromium 内核浏览器的 Python 库。它通过原生 DevTools 协议(CDP)直接控制浏览器,无需依赖 WebDriver,支持绕过验证码、模拟真人交互、网页截图等功能。

5623 2025-10-04

refine: 企业级React后台框架

这是一个专为构建 CRUD(增删改查)应用设计的 Web 框架,只需一行命令即可生成项目骨架,内置登录、列表、详情、编辑页面等功能。业务逻辑与 UI、路由完全解耦,可灵活集成 Ant Design、Material-UI 等设计系统,适用于快速开发管理后台、仪表盘、内部工具和 B2B 应用。

32865 2025-09-13

Retrieval-based-Voice-Conversion-WebUI

Retrieval-based-Voice-Conversion-WebUI是基于VITS的易用变声框架。底模用开源VCTK数据集训练,无版权问题。有训练推理和实时变声界面,具备很多优点。

32357 2025-09-06

n8n: AI自动化工作流工具

基于节点的自动化工作流工具,能帮助用户轻松创建和管理复杂的自动化流程,无需编写大量代码。并且内置了AI能力,支持 400+ 应用和服务!

146989 2025-09-26

OpenIsle- 轻量级的Java开源社区系统

这是一个基于 Spring Boot 和 Vue3 构建的开源自由社区系统,定位为轻量级的 Discourse。它完全开源、可二次开发,支持白名单邀请、自定义标签、实时通知等功能。

393 2025-09-13

node-qrcode

qr code generator

7955 2025-10-17

langchain LLM应用的胶水框架

把大模型和数据库、API、知识库结合起来的胶水框架!它像“乐高积木”一样,把各种AI组件拼起来,让你轻松开发聊天机器人、问答系统、智能助手,不用从零写代码。

116885 2025-09-13

TensorFlow.js: javascript界的机器学习大神

TensorFlow.js 把机器学习能力带进了 JavaScript。训练模型、运行推理,甚至搞实时 AI Web 或移动端、Node 后端。谷歌用,创业公司用,爱好者用,用过都说好。

18976 2025-10-01

squish: 基于浏览器的图像压缩工具

一个现代、基于浏览器的图像压缩工具,结合了现代Web技术和WebAssembly的性能优势,为开发者提供了便捷的图像优化解决方案。无论是处理个人照片还是批量优化网站资源,Squish都能满足多样化的需求。

1022 2025-10-05