首页
/ FastAPI 的历史、设计与未来:从前身工具到标准驱动的架构选型

FastAPI 的历史、设计与未来:从前身工具到标准驱动的架构选型

2026-09-07 15:14:43作者:廉彬冶Miranda

本文基于 FastAPI 仓库的官方文档 history-design-future 章节,并结合当前仓库源码,梳理 FastAPI 是如何从对数十个前身框架的调研中诞生、为何选择以 Python 类型提示为唯一声明语言、如何围绕 OpenAPI/JSON Schema/OAuth2 三大开放标准构建架构,以及它建立在 PydanticStarlette 两大支柱之上的设计逻辑。读完本篇,你将理解 FastAPI "少写代码、强类型、自动文档"这一核心特质背后的工程决策来源,并能从源码层面确认这些设计在仓库中的实际落点。

起源:一个用户的疑问

FastAPI 的这段历史叙述,源于一位早期用户在项目中的提问(原文档引用了一个历史 issue 评论):

这个项目有什么来头?看起来它在短短几周内就直接变得非常出色……

这段叙述的价值,不在于罗列"新功能",而在于回答一个更根本的问题:FastAPI 为什么长成今天这个样子。它本质上是一部"前身工具史"——FastAPI 的历史在很大程度上就是它的众多前身(前代方案)的历史。

前身调研:多年 API 工程经验的积累

作者在撰写本文档时说明,他多年来一直在构建 requirements 非常复杂的 API(机器学习、分布式系统、异步任务、NoSQL 数据库等场景),并领导过多支开发团队。在这个过程中,他被迫检查、测试并实际使用过大量替代方案。

在动手写 FastAPI 代码之前,他其实一直在避免创建新的框架:他先尝试用"多个不同框架 + 插件 + 工具"的组合,来覆盖后来 FastAPI 所实现的全部功能。直到某个节点,他发现除了造一个"能同时提供这些功能、吸收旧工具里最好的思想、把它们以最佳方式组合起来、并运用当时尚不存在的语言特性(Python 3.6+ 类型提示)"的新框架之外,已经没有别的选项了。

没有别人过去的工作,FastAPI 就不复存在。在它之前,已经有很多工具帮助激发了它的诞生。

这段叙述与仓库中 alternatives 章节 相互印证——该章节逐一点评了 Django、Flask、Requests、Swagger/OpenAPI、Marshmallow、Webargs、APISpec、Flask-apispec、NestJS、Sanic、Falcon、Molten、Hug、APIStar 等前身,并说明每个工具给 FastAPI 留下了哪些思想。可以推断,本文档中的"调研"正是这一系列对比的浓缩结论。

研究先行:先读标准,再写代码

一个关键的工程决策是:在开始写任何 FastAPI 代码之前,作者花了数个月研读 OpenAPI、JSON Schema、OAuth2 等规范的文本,理解它们之间的关系、重叠与差异。

这里有两个明确的取向:

  • 理想状态下,框架应该建立在标准 Python 类型提示之上
  • 最佳方式是复用已有的标准,而非自造一套私有 schema。

这一点在当前仓库源码中得到直接印证:

也就是说,"围绕标准设计,而不是事后贴一层"这句话,在仓库里体现为:OpenAPI 模型、JSON Schema 生成、OAuth2 安全流程各自有独立的模块与实现,而不是一个事后拼装的文档层。

设计目标:为开发者体验而设计

在确定技术选型后,作者花时间设计的是"作为使用者(即使用 FastAPI 的开发者)想要得到的那套开发者 API"。其核心手段是在主流 Python 编辑器中反复试验各种想法,包括:

  • PyCharm
  • VS Code
  • 基于 Jedi 的编辑器

原文指出,依据当时的 Python Developer Survey,这套编辑器组合覆盖了约 80% 的 Python 用户。由此得出的结论是:FastAPI 是专门为覆盖 80% Python 开发者所使用的编辑器而测试过的,且由于多数其他编辑器工作方式类似,这些收益应当对几乎全部编辑器生效。

设计目标被明确概括为:尽可能减少代码重复、在每一处获得自动补全、以及类型与错误检查。

从当前仓库结构看,这一目标落在代码层的体现是:

  • 全代码库使用 Annotated 与类型提示(例如 fastapi/params.pyParam 的定义、fastapi/applications.pyFastAPI.__init__ 大量使用 Annotated[..., Doc(...)] 携带文档);
  • 参数语义(query/header/path/cookie)通过 ParamTypes 枚举显式建模,使编辑器能给出精准补全;
  • 测试规模庞大,tests/test_tutorial/ 下有三百余个测试文件,说明"每个特性都可被类型系统与测试验证"这一设计承诺被严格维护。

此外,仓库还配套了专门的编辑器扩展文档 editor-support,说明该"为编辑器体验而设计"的理念已从最初的 PyCharm/VS Code/Jedi 测试,延伸到了官方的 FastAPI VS Code 扩展(路径操作发现、路由导航、CodeLens 跳转等)。

两大核心需求:Pydantic 与 Starlette

调研最终收敛为两个核心依赖(requirements),作者不仅在 FastAPI 中使用了它们,还直接向上游项目贡献代码,使其满足 FastAPI 的要求。

需求一:Pydantic

作者选择了 Pydantic 来处理数据校验、序列化与基于 JSON Schema 的文档生成。他向 Pydantic 贡献了:

  • 让其与 JSON Schema 完全兼容
  • 支持多种不同的约束声明方式(便于编辑器识别);
  • 基于测试提升在多种编辑器中的支持(类型检查、自动补全)。

在当前仓库中,对 Pydantic 的依赖与兼容层非常清晰:

  • pyproject.toml 声明了 pydantic>=2.9.0 这一核心依赖;
  • 仓库设有专门的兼容模块 fastapi/_compat/(含 v2.pyshared.py),用于统一处理 Pydantic 版本相关的字段、schema 生成等底层细节;
  • 所有数据模型、请求体、参数声明都经由 Pydantic 的类型系统流转,这也是"同一份类型声明同时驱动校验、序列化与文档"这一特性的根本来源。

需求二:Starlette

Starlette 是第二个核心需求,作者同样在开发过程中向其贡献了代码。Starlette 是一个轻量级 ASGI 框架/工具包,提供高性能异步服务能力,而 FastAPI 在其之上叠加了数据校验、序列化、文档、依赖注入、安全工具与 OpenAPI 生成等能力。

这一点在源码中是一条继承关系,而非组合:

# fastapi/applications.py
class FastAPI(Starlette):
    """
    `FastAPI` app class, the main entrypoint to use FastAPI.
    """

fastapi/applications.pyclass FastAPI(Starlette)。也就是说,FastAPI直接继承自 Starlette,Starlette 能做的,FastAPI 基本都能做。alternatives 章节 用一句话概括了这种关系:FastAPI "本质上是打了兴奋剂的 Starlette(Starlette on steroids)"。

此外,pyproject.toml 中的 dependencies 同时锁定了 starlette>=0.46.0pydantic>=2.9.0,以及 typing-extensionstyping-inspectionannotated-doc 等辅助依赖,明确了 FastAPI 的运行时基础。

开发阶段:水到渠成

文档指出:到作者真正开始编写 FastAPI 本体代码时,大部分工作其实已经就绪——设计已经敲定,需求与工具已经到位,关于标准与规范的知识清晰而新鲜。

这解释了为什么 FastAPI 能"看起来像几周就成型":真正耗时的工作(调研、读规范、设计开发者 API、向上游 Pydantic/Starlette 贡献)都发生在"写 FastAPI 代码"之前。仓库中最小的入门示例 docs_src/first_steps/tutorial001_py310.py 也印证了这种"极简即可运行"的设计理念:

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def root():
    return {"message": "Hello World"}

几行标准 Python 类型代码,就得到一个带自动 OpenAPI 文档、带 /docs 交互式界面的 API 应用。

面向未来:持续演进

文档结尾强调:FastAPI 的理念已被证明对许多人有价值,它在多种使用场景下优于旧方案而被选择,许多开发者与团队(包括作者自己及其团队)已经在项目中依赖它。但同时仍有大量改进与特性有待加入。

结合仓库现状,可以确认"持续演进"是真实的工程事实,而非口号:

  • pyproject.tomlrequires-python = ">=3.10" 与分类器声明了 Python 3.10–3.14 的支持范围,说明项目紧跟语言演进(这与文档中"Python 3.6+ 类型提示"的历史表述并不矛盾——后者是设计起点的最低要求,前者是当前仓库实际支持的版本区间);
  • 完整的 tests/ 目录(含 tests/benchmarks/tests/memory_benchmarks/ 等)体现了对性能与正确性的持续投入;
  • 仓库提供 fastapi-cli 等项目生成与部署工具链,进一步扩展了"开箱即用"的能力面。

文档最后也指出,社区的帮助非常受欢迎,可参阅 help-fastapi 章节

小结

FastAPI 的设计并非一时灵感,而是一条清晰的可追溯路径:多年复杂 API 工程经验 → 对十余个前身框架的调研与取舍 → 先精读 OpenAPI/JSON Schema/OAuth2 标准 → 以 Python 类型提示为唯一声明语言、面向 80% 开发者使用的编辑器优化体验 → 收敛到 Pydantic(数据与文档)+ Starlette(Web 运行时)两大支柱,并向上游贡献改进 → 最终水到渠成地写成 FastAPI。在仓库中,这一路径分别对应 class FastAPI(Starlette) 的继承、fastapi/openapifastapi/security 的标准实现、fastapi/_compat 的 Pydantic 兼容层,以及 pyproject.toml 中锁定的依赖与 Python 版本区间——"既有标准驱动的实操,也有源码级的原理支撑"。

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

项目优选

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