首页
/ FastAPI 为何而生:替代方案、灵感来源与三大基石组件深度解析

FastAPI 为何而生:替代方案、灵感来源与三大基石组件深度解析

2026-09-06 15:28:39作者:凤尚柏Louis

本文基于 FastAPI 官方文档 Alternatives, Inspiration and Comparisons 整理并扩展,系统回答三个问题:FastAPI 的设计灵感来自哪些前代框架与工具、它在功能取舍上学到了什么,以及它实际依赖的 Pydantic、Starlette、Uvicorn 三个基石组件分别承担什么职责。读完后,你不仅能理解 FastAPI 每一处设计决策的来历(如自动 API 文档、类型提示驱动的校验、依赖注入、ASGI 异步底座),还能通过仓库源码定位到对应的实现与版本约束,从而对技术选型有完整的判断依据。

一、设计背景:从"拒绝造新框架"到"不得不自建"

FastAPI 官方文档开宗明义:FastAPI 不会存在,如果没有前人的工作。在此之前已有大量工具启发了它的诞生。作者明确表示,多年来一直在刻意避免创建一个新框架,最初尝试用"多个框架 + 插件 + 工具"的组合来覆盖 FastAPI 现在提供的所有能力。

但当作者穷尽了组合方案后发现,已经没有办法在不损失体验的情况下拼出全部特性——于是最终只能创建一个集大成者:吸收前人工具的最佳想法,以最优方式组合,并且利用了当时甚至还不存在的语言特性(Python 3.6+ 的类型提示 / type hints)。这段话解释了 FastAPI 的定位:它不是从零发明,而是对 Django、Flask、DRF、Requests、Swagger/OpenAPI、Marshmallow、Webargs、APISpec、Flask-apispec、NestJS、Sanic、Falcon、Molten、Hug、APIStar 等工具的经验做了一次工程化收敛。

二、前代工具的逐一点评与启发

2.1 Django:最流行的 Python 框架,但生而面向 HTML

Django 是最流行、被广泛信任的 Python 框架,被用来构建 Instagram 等系统。但它与关系型数据库(MySQL、PostgreSQL 等)耦合较紧,若想把 NoSQL 数据库(Couchbase、MongoDB、Cassandra 等)作为主存储引擎并不容易。更关键的是,它的设计目标是"在后端生成 HTML",而不是为现代前端(React、Vue.js、Angular)或其他系统(如 IoT 设备)提供 API 服务。因此它没有给 FastAPI 留下直接的功能启发,但它确立的"全功能框架"心智是 FastAPI 对标的参照系之一。

2.2 Django REST Framework:自动 API 文档的第一块拼图

Django REST Framework (DRF) 是为 Django 构建 Web API 的灵活工具包,被 Mozilla、Red Hat、Eventbrite 等众多公司使用。它是**"自动 API 文档"概念最早期的范例之一**——这正是启发作者"寻找 FastAPI"的第一条线索。

给 FastAPI 的启发:拥有一个自动化的 API 文档 Web 用户界面。

一个值得注意的细节:DRF 的作者是 Tom Christie——同时也是 Starlette 和 Uvicorn 的作者,而这两者正是 FastAPI 的底座。FastAPI 的整个技术栈可以看作"Tom Christie 的生态 + Pydantic + 类型提示"的组合,这一事实也解释了为何 FastAPI 与 Starlette、Uvicorn 的配合如此紧密。

2.3 Flask:"微框架"哲学的来源

Flask 是典型的"microframework":不内置数据库集成,也不默认附带 Django 那种全家桶。这种简单性和灵活性反而允许你自由地使用 NoSQL 作为主数据存储。它简单易学(尽管文档在某些地方偏技术化),也常用于不需要数据库、用户管理等 Django 内建功能的应用。

作者明确指出:这种"组件解耦、微框架、可按需扩展"的特性是他希望保留的关键设计。正因为 Flask 足够简单,它似乎与构建 API 的场景非常匹配——下一步自然就是为 Flask 找一个"DRF"。

给 FastAPI 的启发

  • 成为一个微框架,方便自由混搭所需工具和组件;
  • 提供简单、易用的路由系统。

FastAPI 的"微框架"属性在源码中体现得很直接:核心应用类就是一个对 Starlette 的轻量继承,绝大多数复杂度被推迟到按需使用时才产生(如 OpenAPI 生成在首次调用时才执行并缓存,见 applications.py 的 openapi() 方法)。

2.4 Requests:客户端库对服务端 API 设计的反向塑造

FastAPI 并非 Requests 的替代品——两者的作用域完全不同:Requests 是使用 API 的客户端库,FastAPI 是构建 API 的服务端框架,二者位于请求链路的两端,互为补充。实际上在 FastAPI 应用内部调用外部 API 时使用 Requests 非常常见。

Requests 的设计极为简单直观、默认值合理,同时又强大且可定制。例如发一个 GET 请求:

response = requests.get("http://example.com/some/url")

而 FastAPI 中对应的 API 路径操作可以写成(注意第 1 行的对称性):

@app.get("/some/url")
def read_url():
    return {"message": "Hello World"}

对比 requests.get(...)@app.get(...),命名与心智模型高度一致。

给 FastAPI 的启发

  • 拥有简单直观的 API;
  • 直接使用 HTTP 方法名(操作)作为装饰器,直白易懂;
  • 默认值合理,但保留强大的定制能力。

这一启发直接对应源码中的路由 API 设计:app.get() / app.post() 等路径操作方法与 @app.get 装饰器等价,路由注册入口见 applications.py 的 add_api_route()

2.5 Swagger / OpenAPI:选择开放标准而非私有 Schema

作者从 DRF 身上最想继承的功能就是自动 API 文档。随后他发现存在一个用 JSON(或 JSON 的超集 YAML)描述 API 的标准——Swagger;并且已有基于 Swagger 的 Web 用户界面存在。这意味着:只要为 API 生成 Swagger 文档,就能自动获得这些现成的 UI。

Swagger 后来移交给了 Linux Foundation,并更名为 OpenAPI。因此谈 2.0 版本时人们习惯说"Swagger",谈 3.x 及以后则说"OpenAPI"。

给 FastAPI 的启发

  • 采用开放标准(OpenAPI)作为 API 规范,而不是自定义 schema;
  • 集成基于标准的 UI 工具:Swagger UI 与 ReDoc。

这两个 UI 被选中的理由是"相当流行且稳定";而社区中还有数十种 OpenAPI UI 替代品可以配合 FastAPI 使用。

这一点在仓库源码中有清晰的落地:

  • FastAPI 构造函数提供 docs_url(默认 "/docs")、redoc_url(默认 "/redoc")等参数,均可为 None 关闭,见 applications.py
  • setup() 方法在启动时把 /openapi.jsonopenapi_url)、/docs(Swagger UI HTML)、/redoc(ReDoc HTML)与 OAuth2 重定向路由挂到应用上,见 applications.py 的 setup()
  • OpenAPI schema 的生成入口是 openapi/utils.py 的 get_openapi(),默认 openapi_version="3.1.0",即生成的是 OpenAPI 3.x 规范。

换言之,DRF 留下的"自动文档"想法,最终通过"OpenAPI 标准 + 现成 UI"这条路线在 FastAPI 中实现。

2.6 Flask 生态的 REST 组件链:Marshmallow → Webargs → APISpec → Flask-apispec

作者为 Flask 寻找"DRF"时,逐个评估了 Flask REST 生态。值得注意的是:这些 Flask REST 框架中许多已经停更或被放弃,存在若干悬而未决的问题,使其不再适用。

Marshmallow(序列化与校验) API 系统需要的核心能力之一是数据"序列化"(serialization,又称 marshalling、conversion):把代码中的数据(Python 对象)转换成可经网络传输的形式,例如把数据库对象转成 JSON、把 datetime 对象转成字符串。另一项核心能力是数据校验:确保数据在给定参数下合法,例如某字段必须是 int 而不是任意字符串。没有校验系统,这些检查只能在代码里手工完成。Marshmallow 正是为此而生,作者此前大量使用过它。但它诞生于 Python 类型提示出现之前,定义每个 schema 都需要使用 Marshmallow 提供的特定工具类。

启发:用代码(而非专用 DSL 类)定义提供数据类型与校验的"schema",并让文档自动化。

Webargs(入站数据解析) API 的另一大刚需是从入站请求中解析(parsing)数据并转换成 Python 数据。Webargs 正是构建在多个框架(包括 Flask)之上的工具,底层用 Marshmallow 做校验,且与 Marshmallow 出自同一批开发者。

启发:对入站请求数据做自动校验。

APISpec(文档补齐,但暴露了"双语法"痛点) Marshmallow + Webargs 解决了校验、解析与序列化,但还缺文档,于是有了 APISpec——它是多框架插件(也有 Starlette 插件),工作方式是:在路由处理函数的 docstring 里用 YAML 格式书写 schema 定义,然后生成 OpenAPI schema。问题随之而来:这又形成了一套嵌在 Python 字符串里的微语法(一大坨 YAML),编辑器帮不上什么忙;而且一旦修改了参数或 Marshmallow schema 却忘了同步修改 docstring 里的 YAML,生成的 schema 就会过时。

启发:支持 OpenAPI 这一 API 开放标准。

Flask-apispec(组合拳与最终形态) Flask-apispec 是把这些组件串起来的 Flask 插件:用 Webargs 与 Marshmallow 的信息,通过 APISpec 自动生成 OpenAPI schema。作者评价它"很棒但被严重低估,理应比许多 Flask 插件更流行"——可能原因只是文档过于简洁抽象。它解决了"在 Python docstring 里写 YAML"的痛点。"Flask + Flask-apispec + Marshmallow + Webargs"是作者构建 FastAPI 之前最爱的后端技术栈,并由此衍生了多个全栈生成器项目,这些生成器后来又成为 FastAPI 项目生成器(Project Generators)的基础,参见 Project Generators 文档

启发:OpenAPI schema 应从"同一份定义序列化与校验的代码"中自动生成——这是 FastAPI 类型提示驱动的文档能力的设计原点。

这条演进链清晰地展示了 FastAPI 数据层的设计逻辑:与其让开发者维护"代码 + 一套 YAML 文档"两份真相,不如让"类型提示 + Pydantic 模型"同时驱动校验、序列化与 OpenAPI 生成。FastAPI 当前对 Pydantic 的最低版本约束见 pyproject.tomlpydantic>=2.9.0),并配合 pydantic-settingspydantic-extra-types 等生态包。

2.7 NestJS(与 Angular):依赖注入与类型支持的对照实验

NestJS 甚至不是 Python——它是一个受 Angular 启发的 JavaScript(TypeScript)NodeJS 框架,但实现了与 Flask-apispec 类似的目标:

  • 它内置了受 Angular 2 启发的依赖注入系统,与作者所知的其他 DI 系统一样需要预注册"injectables",增加了啰嗦度和代码重复;
  • 参数用 TypeScript 类型(类似 Python 类型提示)描述,编辑器支持相当好;
  • 但 TypeScript 类型在编译为 JavaScript 后不再保留,因此无法同时靠类型完成校验、序列化与文档。加上一些设计决策,要在很多地方添加装饰器才能同时获得校验、序列化与自动 schema 生成,代码相当冗长;
  • 它对嵌套模型的处理不佳:如果请求 JSON body 是包含内层嵌套 JSON 对象的对象,它就无法被正确文档化和校验。

给 FastAPI 的启发

  • 用 Python 类型获得优秀的编辑器支持;
  • 拥有强大的依赖注入系统,并找到最小化代码重复的方式。

FastAPI 的依赖注入系统正是对这一启发(以及对 NestJS 预注册模式的改进)的落地:依赖按类型/协程签名解析、按需惰性求值,核心求解逻辑在 dependencies/utils.py 的 solve_dependencies();与 NestJS 不同,FastAPI 的依赖通过函数参数声明即可生效,无需集中预注册。

2.8 Sanic:异步性能路线的开路者

Sanic 是最早一批基于 asyncio 的极快 Python 框架之一,设计目标是高度类似 Flask。

技术细节:它用 uvloop 替代了 Python 默认的 asyncio 事件循环,这是它速度极快的原因。它明显启发了 Uvicorn 与 Starlette,而后者目前在公开基准测试中比 Sanic 更快。

给 FastAPI 的启发:找到一种方式获得"疯狂"的性能。这就是为什么 FastAPI 基于 Starlette——它是当时(经第三方基准测试验证的最快)框架。

2.9 Falcon:request/response 双对象设计的取舍

Falcon 是另一个高性能 Python 框架,设计为极简、可作其他框架(如 Hug)的地基。它的设计是函数接收两个参数——"request" 与 "response",从 request"读"数据、向 response"写"数据。由于这种设计,无法用标准 Python 类型提示作为函数参数来声明请求参数和 body,因此数据校验、序列化与文档只能在代码中手工完成,或以 Hug 这样的上层框架形式实现。受 Falcon 这种"一 request + 一 response 双参数"设计启发的其他框架也存在同样的区分。

给 FastAPI 的启发:寻找获得高性能的方式。 同时,Hug(基于 Falcon)启发了 FastAPI 在路径操作函数中声明 response 参数。不过在 FastAPI 中它是可选的,主要用于设置响应头、Cookie 与替代状态码。

2.10 Molten:思路相近,但取舍不同

Molten 是作者在建 FastAPI 早期发现的框架,理念相当相似:基于 Python 类型提示、由类型驱动校验与文档、内置依赖注入系统。不同之处在于:

  • 它没有使用 Pydantic 这类第三方数据校验/序列化/文档库,而是自研了一套,因此其数据类型定义的可复用性较差;
  • 配置稍微更啰嗦;
  • 基于 WSGI(而非 ASGI),无法享受 Uvicorn、Starlette、Sanic 等工具带来的高性能;
  • 其依赖注入系统要求预注册依赖,且按声明的类型解析依赖,因此不可能声明多个提供同一类型的"组件";
  • 路由集中声明在一个地方(引用的函数定义在别处),而非像 Flask/Starlette 那样用装饰器直接放在处理函数上方。这更接近 Django 的风格,把逻辑上紧耦合的东西在代码中拆开了。

给 FastAPI 的启发:用模型属性的"default 值"来定义数据类型的额外校验,以改善编辑器支持——这一点在当时 Pydantic 中尚不具备。这一启发实际上促使作者更新了 Pydantic 的相应部分,以支持同样的校验声明风格(该功能如今已在 Pydantic 中原生提供)。

2.11 Hug:类型提示声明参数的先驱

Hug 是最早用 Python 类型提示声明 API 参数类型的框架之一,这是一个启发了众多后续工具的好想法。它当时在声明中使用的是自定义类型而非标准 Python 类型,但依然是巨大的进步。它也是最早生成"以 JSON 描述整个 API"的自定义 schema 的框架之一——不过它没有基于 OpenAPI / JSON Schema 这类标准,因此难以与 Swagger UI 等工具直接集成,但想法本身极具创新性。

它还有一个少见而有趣的特性:用同一个框架既可以创建 API,也可以创建 CLI。由于它基于同步 Web 框架的旧标准 WSGI,它无法处理 WebSocket 等场景,尽管性能依然很高。

注:Hug 的作者是 Timothy Crosley,他也是自动排序 import 的工具 isort 的作者。

启发总结:Hug 启发了 APIStar 的部分设计,也是作者认为最有前景的工具之一(与 APIStar 并列)。它帮助启发了 FastAPI 用类型提示声明参数、自动生成 API schema,以及用 response 参数设置响应头与 Cookie 的做法。

2.12 APIStar(≤ 0.5):直接的"精神前辈"

在决定构建 FastAPI 前夕,作者发现了 APIStar。它几乎拥有作者想要的一切,且设计优秀:

  • 是他所见过的最早一批(早于 NestJS 和 Molten)用 Python 类型提示声明参数与请求的框架实现,且与 Hug 差不多同时期发现。区别在于 APIStar 使用的是 OpenAPI 标准
  • 在多处基于同一套类型提示实现自动数据校验、序列化与 OpenAPI schema 生成;
  • body schema 定义没有采用 Pydantic 那样的标准 Python 类型提示,而更接近 Marshmallow,因此编辑器支持没那么好——但即便如此,APIStar 仍是当时最佳可用选项;
  • 当时它的性能基准测试最好(仅被 Starlette 超越);
  • 最初没有自动 API 文档 Web UI,但作者知道可以为它加上 Swagger UI;
  • 有依赖注入系统(同样需要预注册组件);
  • 作者始终没能在完整项目中使用它,因为它缺少安全集成,无法替代基于 Flask-apispec 的全栈生成器的全部功能——"为它提交一个添加安全功能的 PR"一直挂在作者的待办列表里。

随后项目重心发生了转移:由于作者需要专注于 Starlette,APIStar 不再是 API Web 框架,如今它是一套校验 OpenAPI 规范的工具体系,而非 Web 框架。

注:APIStar 也是 Tom Christie 的作品——他同时创建了 Django REST Framework、Starlette(FastAPI 的底座)与 Uvicorn(Starlette 与 FastAPI 使用的服务器)。

给 FastAPI 的启发:存在本身。 "用同一套 Python 类型同时声明数据校验、序列化与文档,同时获得优秀编辑器支持"——作者认为这是一个天才般的想法。在长期寻找同类框架、测试大量替代方案后,APIStar 是最佳选项。而当 APIStar 停止作为服务器存在、Starlette 被创造出来并提供了更好的地基时,这成为构建 FastAPI 的最终灵感。作者把 FastAPI 视为 APIStar 的"精神继承者"(spiritual successor),并在特性、类型系统及其他方面基于前述所有工具的经验做了改进与扩充。

三、FastAPI 真正使用的三大基石:Pydantic、Starlette、Uvicorn

与"灵感来源"不同,下面三个组件是 FastAPI 当前实际依赖并集成的核心。依赖版本约束在 pyproject.toml 中有明确定义(starlette>=0.46.0pydantic>=2.9.0uvicorn[standard]>=0.12.0python-multipart>=0.0.18 等),可直接作为生产环境的选型参考。

3.1 Pydantic:类型提示驱动的校验、序列化与文档

Pydantic 是基于 Python 类型提示定义数据校验、序列化与文档(使用 JSON Schema)的库,因此极其直观。它与 Marshmallow 对等,但基准测试中比 Marshmallow 更快;由于基于同样的 Python 类型提示,编辑器支持极佳。

FastAPI 用它来处理所有数据校验、数据序列化与自动模型文档(基于 JSON Schema)。FastAPI 再把这份 JSON Schema 数据放进 OpenAPI,与其余所有元数据一起组成完整 schema。这与第二节 Flask 生态部分"schema 应从同一份代码自动生成"的启发完全闭环。

3.2 Starlette:ASGI 微框架底座,FastAPI 的"父类"

Starlette 是轻量级 ASGI(构建异步 Python Web 应用的新标准)框架/工具包,非常适合构建高性能 asyncio 服务。它简单直观,设计上易于扩展、组件模块化,特性包括:

  • 令人印象深刻的高性能;
  • WebSocket 支持;
  • 进程内后台任务(in-process background tasks);
  • 启动/关闭事件(startup/shutdown events);
  • 基于 HTTPX 的测试客户端;
  • CORS、GZip、静态文件、流式响应;
  • Session 与 Cookie 支持;
  • 100% 测试覆盖率;100% 类型注解代码库;
  • 极少的硬依赖。

Starlette 是当前被测的最快 Python 框架,仅被 Uvicorn 超越——而 Uvicorn 不是框架,是服务器。Starlette 提供了 Web 微框架的全部基础功能,但不提供自动数据校验、序列化或文档。这正是 FastAPI 在其上添加的主要内容——全部基于 Python 类型提示(经由 Pydantic),外加依赖注入系统、安全工具、OpenAPI schema 生成等。

技术细节:ASGI 是由 Django 核心团队参与开发的"新标准"。它目前还不是正式 Python 标准(PEP),尽管流程已在推进中。但它已被多个工具当作"标准"使用,这大幅改善了互操作性:你可以把 Uvicorn 换成任何 ASGI 服务器(如 Daphne 或 Hypercorn),也可以接入 ASGI 兼容工具(如 python-socketio)。

FastAPI 用它来处理所有核心 Web 部分,并在其上叠加特性。类 FastAPI 直接继承自类 Starlette——这一点可以在源码中直接验证:applications.py 第 42 行 即为 class FastAPI(Starlette):。因此你用 Starlette 能做的一切,都能直接用 FastAPI 做——它基本上是"打了强化针的 Starlette"。

3.3 Uvicorn:推荐的 ASGI 服务器

Uvicorn 是构建在 uvloophttptools 之上的高速 ASGI 服务器。它不是 Web 框架而是服务器——例如它不提供按路径路由的工具,那是 Starlette(或 FastAPI)这类框架在其上提供的事情。它是 Starlette 与 FastAPI 的推荐服务器。

FastAPI 推荐它作为运行 FastAPI 应用的主 Web 服务器。你也可以使用 --workers 命令行选项获得异步多进程服务器;生产部署的完整方案(含 Docker 场景下 worker 数量的取舍)见 Deployment 文档Docker 部署指南。例如在多 worker 场景下的典型写法(摘自部署文档):

CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"]

其中 --workers 将 worker 进程数设为 4;注意容器化部署中通常一个容器一个 Uvicorn 进程、水平扩展容器,而不是在容器内堆 worker(见 deployment/docker.md)。

四、架构落点:从文档理念到 FastAPI 源码的对应关系

把全文的"灵感—落地"线索汇总,可以在仓库中逐条对上:

前代工具的启发 FastAPI 中的落点(仓库内可查证)
DRF 的自动 API 文档 setup() 自动挂载 /docs/redoc/openapi.json 路由,见 applications.py
Swagger/OpenAPI 标准 get_openapi() 默认生成 OpenAPI 3.1.0 schema,见 openapi/utils.py
Marshmallow/Webargs 的校验与序列化 由 Pydantic 承担,版本约束 pydantic>=2.9.0,见 pyproject.toml
Flask 的微框架 + 简单路由 FastAPI 直接继承 Starlette,见 applications.py;路由 API 如 app.get()
NestJS 的依赖注入(去预注册化) solve_dependencies() 按声明惰性求解,见 dependencies/utils.py
Falcon/Hug 的 response 参数 FastAPI 中 response 为可选参数,主要用于设置头、Cookie 与替代状态码
Molten 的"default 值即校验" 已回馈 Pydantic,模型属性的默认值可同时承载校验声明
Sanic/Starlette 的性能路线 异步 ASGI 底座,WebSocket、后台任务等能力继承自 Starlette
APIStar 的"同类型提示驱动一切" 类型提示同时驱动校验、序列化、OpenAPI 生成,openapi() 首次调用后缓存于 app.openapi_schema,见 applications.py
APIStar 缺失的安全集成 FastAPI 内建 fastapi/security/ 模块(OAuth2、HTTP Basic/Bearer/Digest、API Key 的 query/header/cookie 形式、OpenID Connect 等),见 security 目录

五、性能与基准:理解 Uvicorn、Starlette 与 FastAPI 的分层差异

要理解、对比并看清 Uvicorn、Starlette 与 FastAPI 之间的性能差异与各自角色(服务器 / 框架 / 框架之上叠加层),文档建议阅读专门的 Benchmarks 章节。简而言之:Uvicorn 是服务器层(最快,但它不提供路由等框架能力),Starlette 是框架层(被测最快框架),FastAPI 在 Starlette 之上叠加校验、文档与安全等能力——性能与功能的取舍正是第二节中 Sanic 到 APIStar 这条"性能—能力"演进链的最终答案。

六、小结

FastAPI 的每一项核心设计都能在某个前代工具中找到源头:DRF 给了"自动文档"的初心,Flask 给了"微框架"的形态,Requests 给了 @app.get 式的直觉 API,Swagger/OpenAPI 给了开放标准的选择,Marshmallow/Webargs/Flask-apispec 给了"一份代码同时定义校验、序列化与文档"的诉求,NestJS 与 APIStar 给了类型提示驱动与依赖注入的蓝图,Sanic 与 Falcon 定义了性能目标,Hug 与 Molten 则分别贡献了类型提示参数与"默认值即校验"的细节。而真正让这一切成为现实的,是 Pydantic、Starlette 与 Uvicorn 这三大基石——它们既是灵感,也是 FastAPI 源码中可逐行验证的依赖事实。理解这条"灵感 → 落地"的完整链路,是把握 FastAPI 设计哲学与正确做技术选型的最短路径。

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