首页
/ FastAPI 核心特性与快速上手:基于 Python 类型提示的高性能 Web API 开发框架

FastAPI 核心特性与快速上手:基于 Python 类型提示的高性能 Web API 开发框架

2026-09-03 15:21:58作者:丁柯新Fawn

本文为 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.mdpyproject.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")、summaryversiondescription 等元数据参数,它们都会体现在生成的 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 都接受 GET operation(即 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 文档:

FastAPI 应用 /docs 页面下的 Swagger UI 交互文档,展示 GET /items/{item_id} 的路径参数 item_id 与查询参数 q 以及 200/422 响应

再打开 http://127.0.0.1:8000/redoc,可以看到由 ReDoc 提供的另一套自动文档。

从源码看,这两个文档页面的路由由 fastapi/applications.pydocs_url(默认 /docs,对应 Swagger UI)与 fastapi/applications.pyredoc_url(默认 /redoc)控制,页面 HTML 分别由 fastapi/openapi/docs.py 中的 get_swagger_ui_htmlget_redoc_html 生成;而它们渲染的 OpenAPI Schema 则由 fastapi/openapi/utils.pyget_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

  1. 交互式文档已自动更新,包含新的请求体;
  2. 点击 Try it out 按钮即可填写参数并直接操作 API;

Swagger UI 中 PUT /items/{item_id} 的 Try it out 面板,可填写 item_id 与 JSON 请求体

  1. 点击 Execute 后,界面与 API 通信、发送参数并展示返回结果;
  2. http://127.0.0.1:8000/redoc 的替代文档同样会反映新的查询参数与请求体。

ReDoc 文档界面中 Save Item Put 端点的路径参数与请求体 Schema 展示

一次声明,多处生效(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),支持:
    • 基本类型(strintfloatboollist 等);
    • datetime 对象;
    • UUID 对象;
    • 数据库模型;
    • 等等。
  • 自动交互式 API 文档,并提供两套替代界面:
    • Swagger UI;
    • ReDoc。

FastAPI 对示例代码的具体处理

回到升级后的代码,FastAPI 实际完成了以下工作:

  • GETPUT 请求,校验路径中必须存在 item_id
  • 校验 item_idint 类型;若不是,客户端会看到一个有用的、清晰的错误(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.pyJinja2Templates)所必需;
  • python-multipart —— 支持表单解析(request.form())所必需。

FastAPI 使用:

  • uvicorn(含 uvicorn[standard],带来 uvloop 等高性能事件循环依赖)——加载并服务应用的服务器;
  • fastapi-cli[standard] —— 提供 fastapi 命令;
    • 其中包含 fastapi-cloud-cli,用于将应用部署到 FastAPI Cloud。

此外,pyproject.tomlstandard 组还包含 fastar >= 0.9.0(由 fastapi-cli 拉入的 ASGI 服务器组件)以及设置管理相关的 pydantic-settingspydantic-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-clipyproject.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.pyORJSONResponse 所必需;
    • ujson —— 使用 UJSONResponse 所必需。

仓库结构与许可

小结

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/ 中对应的可运行示例。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.12 K
2.72 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
527
590
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
904
1.82 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
854
1.34 K
docsdocs
暂无描述
Markdown
889
5.78 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.52 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.33 K
1.45 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
980
502
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
540
384