FastAPI 核心特性与快速上手:基于 Python 类型提示的高性能 Web API 开发框架
本文为 FastAPI(当前版本 0.141.1,见 fastapi/init.py)的入门与框架导读,覆盖从安装、最小可运行示例、交互式 API 文档到 Pydantic 请求体声明的完整链路。读完本文,你能够独立搭建一个带自动文档、参数校验和类型转换的 FastAPI 应用,并理解其性能来源(Starlette + Pydantic + Uvicorn)与依赖体系(fastapi[standard] 各可选依赖组)的实际含义。
FastAPI 是什么:定位与核心特性
FastAPI 是一个基于标准 Python 类型提示(type hints)构建的现代、高性能 Web 框架,用于开发 API。其官方定位为:high performance, easy to learn, fast to code, ready for production(高性能、易学、编码快、可投产),这一定位同时写入了 README.md 与 pyproject.toml 的项目描述中。
README 中列出的关键特性如下,每一条都对应框架内可验证的具体机制:
| 特性 | 说明 | 仓库中的佐证 |
|---|---|---|
| Fast(高性能) | 性能与 NodeJS、Go 相当,是 Python 生态中最快的框架之一(得益于 Starlette 与 Pydantic) | 依赖约束见 pyproject.toml,运行时由 Uvicorn 承载 |
| Fast to code(开发快) | 功能开发速度提升约 200%~300%(内部团队构建生产应用的估算值) | 一次类型声明同时驱动校验、转换与文档生成 |
| Fewer bugs(更少 bug) | 减少约 40% 由人为失误导致的错误(同上,估算值) | 请求数据在进入业务逻辑前即被 Pydantic 校验 |
| Intuitive(直观) | 编辑器全方位自动补全(Completion/IntelliSense),减少调试时间 | item: Item 声明后编辑器可直接补全 item.name 等属性 |
| Easy(易学) | 设计易用易学,减少查阅文档的时间 | 无需学习特定库的新语法,纯标准 Python |
| Short(简洁) | 最小化代码重复,一个参数声明承载多种功能 | 路径参数、查询参数、请求体均用函数签名表达 |
| Robust(健壮) | 直接产出生产就绪代码,附带自动交互式文档 | /docs(Swagger UI)与 /redoc(ReDoc)开箱即用 |
| Standards-based(基于标准) | 基于并完全兼容 OpenAPI(原 Swagger)与 JSON Schema 开放标准 | OpenAPI 生成实现在 fastapi/openapi/ 目录 |
站在巨人肩膀上:底层依赖
FastAPI 的架构建立在两个核心库之上:
- Starlette:负责 Web 层(ASGI 应用、路由、中间件、响应等)。FastAPI 应用类直接继承自
Starlette,因此天然拥有 Starlette 的中间件、WebSocket、静态文件等能力; - Pydantic:负责数据层(模型定义、校验、序列化)。请求体的 JSON 解析与校验、响应序列化均由 Pydantic 驱动。
pyproject.toml 中声明了硬性依赖及最低版本:
dependencies = [
"starlette>=0.46.0",
"pydantic>=2.9.0",
"typing-extensions>=4.8.0",
"typing-inspection>=0.4.2",
"annotated-doc>=0.0.2",
]
Python 版本要求为 requires-python = ">=3.10"(pyproject.toml),官方 classifiers 覆盖 3.10 至 3.14。这也解释了 README 示例代码为何直接使用 str | None 这类 3.10+ 原生联合类型语法,而非 Optional[str]。
安装:uv add "fastapi[standard]"
推荐流程是先安装 uv,然后在项目目录中执行:
$ uv add "fastapi[standard]"
注意:务必把
"fastapi[standard]"放在引号内,确保[]在各类终端/Shell 中不被解析为通配符,否则安装可能失败。
如果偏好 pip,则在虚拟环境中安装 fastapi[standard]。standard 是可选依赖组(extra),其真实清单定义在 pyproject.toml 的 [project.optional-dependencies] 中,本文后文会逐项解释每个组件的作用。
命令行入口 fastapi 从哪来
安装 fastapi[standard] 后会得到 fastapi 命令行工具。从源码结构看,该命令是 pyproject.toml 中注册的脚本入口:
[project.scripts]
fastapi = "fastapi.cli:main"
而 fastapi/cli.py 本身只是一层转发:它尝试从 fastapi_cli 包导入 main;如果未安装 fastapi-cli,会直接打印提示并抛出 RuntimeError:
message = 'To use the fastapi command, please install "fastapi[standard]":\n\n\tpip install "fastapi[standard]"\n'
也就是说:只执行 uv add fastapi(不带 standard)时,fastapi 命令不可用,需要手动用 Uvicorn 等方式启动 ASGI 应用;而 uv run fastapi dev 这类开发体验完全依赖 fastapi-cli[standard] 组件。
最小示例:创建应用
创建 main.py,内容如下:
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: str | None = None):
return {"item_id": item_id, "q": q}
如果代码中使用了 async / await,请将端点函数改为 async def:
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: str | None = None):
return {"item_id": item_id, "q": q}
选型建议:端点内部如果调用的是异步 I/O(数据库驱动、HTTP 客户端等 await 调用),用 async def;如果是阻塞式同步调用,用普通 def 即可——FastAPI 会将其调度到线程池执行,避免阻塞事件循环。
FastAPI 应用类的完整参数定义见 fastapi/applications.py,除了 debug,还支持 title(默认 "FastAPI")、summary、version、description 等元数据参数,它们都会体现在生成的 OpenAPI 文档中。
运行:fastapi dev 开发服务器
在项目目录下运行:
$ uv run fastapi dev
典型输出(README 实录):
╭────────── 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 应用实例,并启动基于 Uvicorn 的 ASGI 服务器; - 开发模式下默认开启自动重载(输出中的
Started reloader process ... using WatchFiles即热重载监视进程),修改main.py保存后服务器自动重启; - 生产环境应使用
fastapi run(输出中的提示语for production use: fastapi run明确了这一分工)。
验证:访问 API 并理解请求语义
浏览器打开 http://127.0.0.1:8000/items/5?q=somequery,返回 JSON:
{"item_id": 5, "q": "somequery"}
此时已经拥有了一个完整 API,其结构可拆解为:
- 接收 HTTP 请求的 path(路径):
/与/items/{item_id}; - 两个 path 都接受
GEToperation(即 HTTP method); /items/{item_id}有一个应为int类型的 path parameter(路径参数)item_id;/items/{item_id}还有一个可选的str类型 query parameter(查询参数)q。
自动交互式 API 文档
打开 http://127.0.0.1:8000/docs,可以看到由 Swagger UI 提供的自动交互式 API 文档:
再打开 http://127.0.0.1:8000/redoc,可以看到由 ReDoc 提供的另一套自动文档。
从源码看,这两个文档页面的路由由 fastapi/applications.py 的 docs_url(默认 /docs,对应 Swagger UI)与 fastapi/applications.py 的 redoc_url(默认 /redoc)控制,页面 HTML 分别由 fastapi/openapi/docs.py 中的 get_swagger_ui_html 与 get_redoc_html 生成;而它们渲染的 OpenAPI Schema 则由 fastapi/openapi/utils.py 的 get_openapi 从应用的路由与类型注解中提取生成。因此文档并非手工编写,而是与代码声明保持强一致的自动产物。
示例升级:用 Pydantic 声明 PUT 请求体
修改 main.py,新增一个接收 PUT 请求体的端点。请求体用标准 Python 类型 + Pydantic BaseModel 声明:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: bool | None = None
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: 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 服务器会自动重载。回到 http://127.0.0.1:8000/docs:
- 交互式文档已自动更新,包含新的请求体;
- 点击 Try it out 按钮即可填写参数并直接操作 API;
- 点击 Execute 后,界面与 API 通信、发送参数并展示返回结果;
http://127.0.0.1:8000/redoc的替代文档同样会反映新的查询参数与请求体。
一次声明,多处生效(Recap)
总结这个升级示例的核心思想:只需以函数参数的形式声明一次类型(参数、请求体等),且使用的是标准现代 Python 类型——不需要学习新的语法或某个库特有的方法/类。
例如声明一个 int:
item_id: int
或声明一个更复杂的 Item 模型:
item: Item
这单一声明同时带来以下能力:
- 编辑器支持:自动补全(Completion)、类型检查(Type checks);
- 数据校验:数据非法时自动给出清晰的错误;甚至支持深度嵌套的 JSON 对象校验;
- 输入转换(Conversion/反序列化):把来自网络的数据转换为 Python 数据类型,读取来源包括:
- JSON;
- 路径参数(Path parameters);
- 查询参数(Query parameters);
- Cookies;
- 请求头(Headers);
- 表单(Forms);
- 文件(Files);
- 输出转换(Conversion/序列化):把 Python 数据类型转换为网络数据(JSON),支持:
- 基本类型(
str、int、float、bool、list等); datetime对象;UUID对象;- 数据库模型;
- 等等。
- 基本类型(
- 自动交互式 API 文档,并提供两套替代界面:
- Swagger UI;
- ReDoc。
FastAPI 对示例代码的具体处理
回到升级后的代码,FastAPI 实际完成了以下工作:
- 对
GET与PUT请求,校验路径中必须存在item_id; - 校验
item_id是int类型;若不是,客户端会看到一个有用的、清晰的错误(HTTP 422); - 对
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 的输入与输出转换;
- 用 OpenAPI 记录一切,OpenAPI 可被用于:
- 交互式文档系统;
- 面向多种语言的自动客户端代码生成系统;
- 直接提供两套交互式文档 Web 界面(Swagger UI 与 ReDoc)。
一个体现"编辑器支持"的小实验:把
return {"item_name": item.name, "item_id": item_id}
中的
return {
... "item_name": item.name ...
}
改成
return {
... "item_price": item.price ...
}
可以看到编辑器会基于 Item 模型自动补全属性并识别其类型——这一切源于 item: Item 的类型注解,而非任何魔法字符串。
部署(可选)
README 给出了一条可选的部署路径——将应用部署到 FastAPI Cloud:
$ uv run fastapi deploy
该命令会自动检测 FastAPI 应用并完成部署;未登录时浏览器会打开以完成认证。FastAPI Cloud 由 FastAPI 的同一作者与团队构建,是相关开源项目的主要资助方。
需要注意:FastAPI 是开源且基于开放标准的,应用可以部署到任意云服务商/服务器(本质上是一个 ASGI 应用,配合 Uvicorn 等 ASGI 服务器运行即可),是否使用 FastAPI Cloud 完全取决于个人偏好。生产环境本地运行时使用 fastapi run(而非 fastapi dev,开发模式的重载与调试开销不适合生产)。
性能
独立的 TechEmpower 基准测试表明:运行在 Uvicorn 之下的 FastAPI 应用是当前可用的最快 Python 框架之一,仅次于其内部使用的 Starlette 与 Uvicorn 本身。对性能与基准方法感兴趣可参考仓库文档站点的 Benchmarks 章节(对应本仓库 docs/en/docs/ 目录下的完整教程文档)。
依赖体系详解:standard 与其他可选依赖组
README 明确区分了四种安装组合,结合 pyproject.toml 的实际定义,整理如下。
standard 组(uv add "fastapi[standard]")
这是推荐组合,其各组件用途:
Pydantic 使用:
email-validator—— 用于校验EmailStr等邮箱字段(版本约束>=2.0.0)。
Starlette 使用:
httpx—— 使用TestClient进行测试所必需;jinja2—— 使用默认模板配置(如 fastapi/templating.py 的Jinja2Templates)所必需;python-multipart—— 支持表单解析(request.form())所必需。
FastAPI 使用:
uvicorn(含uvicorn[standard],带来uvloop等高性能事件循环依赖)——加载并服务应用的服务器;fastapi-cli[standard]—— 提供fastapi命令;- 其中包含
fastapi-cloud-cli,用于将应用部署到 FastAPI Cloud。
- 其中包含
此外,pyproject.toml 中 standard 组还包含 fastar >= 0.9.0(由 fastapi-cli 拉入的 ASGI 服务器组件)以及设置管理相关的 pydantic-settings、pydantic-extra-types(README 将后两者归类为"可选依赖",实际已随 standard 一并安装)。
安装组合对照
| 安装命令 | 效果 |
|---|---|
uv add "fastapi[standard]" |
核心 + 全部 standard 可选依赖(含 fastapi-cloud-cli) |
uv add fastapi |
仅核心依赖(starlette/pydantic/typing-extensions 等),无 fastapi CLI、无 Uvicorn |
uv add "fastapi[standard-no-fastapi-cloud-cli]" |
standard 全量,但排除 fastapi-cloud-cli(pyproject.toml 中独立定义的依赖组) |
uv add "fastapi[all]" |
pyproject.toml 中的 all 组:在 standard 基础上额外包含 itsdangerous(Starlette 的 SessionMiddleware 用)与 pyyaml |
额外可选依赖
视功能需要还可按需安装:
- Pydantic 相关:
pydantic-settings—— 设置(settings)管理;pydantic-extra-types—— Pydantic 扩展数据类型;
- FastAPI 相关:
orjson—— 使用 fastapi/responses.py 中ORJSONResponse所必需;ujson—— 使用UJSONResponse所必需。
仓库结构与许可
- 许可协议:MIT(LICENSE);
- 核心框架源码位于 fastapi/ 目录:applications.py(
FastAPI应用类)、routing.py(APIRouter与路由)、openapi/(OpenAPI 生成与文档页)、security/(OAuth2/HTTP Basic/API Key 等安全方案)、middleware/(CORS 等中间件); - 教程配套可运行示例位于 docs_src/(如 docs_src/first_steps/tutorial001_py310.py 即本文最小示例的官方实现,含路径参数与查询参数校验变体);
- 测试用例位于 tests/(含 tests/test_tutorial/ 下 300+ 针对教程示例的回归测试);
- 多语言文档源位于 docs/,其中英文教程主文档在 docs/en/docs/。
小结
FastAPI 的设计闭环是:标准 Python 类型注解 → Pydantic 校验与双向转换 → OpenAPI 自动生成 → Swagger UI/ReDoc 交互式文档,一次声明在编辑器支持、运行时校验、API 文档三个层面同时兑现。配合 fastapi[standard] 提供的 Uvicorn、fastapi dev 热重载与 fastapi run 生产模式,从 main.py 两行路由代码到可部署的 ASGI 应用之间几乎没有摩擦。更完整的进阶内容(表单、文件上传、依赖注入、OAuth2 安全、数据库等)可继续阅读 docs/en/docs/ 下的 Tutorial - User Guide 与 docs_src/ 中对应的可运行示例。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0622
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00


