FastAPI 设计溯源:从 Django 到 APIStar,FastAPI 从哪些替代框架中继承了核心设计 FastAPI 设计溯源从 Django 到 APIStarFastAPI 从哪些替代框架中继承了核心设计【免费下载链接】fastapiFastAPI framework, high performance, easy to learn, fast to code, ready for production项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi本文基于 FastAPI 官方文档的 代替工具比较章节系统梳理 FastAPI 的设计血缘逐一分析 Django、Flask、Requests、Marshmallow、Hug、APIStar 等 15 个替代工具各自给 FastAPI 留下了什么核心设计思想以及 Pydantic、Starlette、Uvicorn 这三大底层组件在 FastAPI 架构中承担的具体职责并结合当前仓库源码fastapi/applications.py、fastapi/openapi/utils.py、pyproject.toml验证这些设计理念在实现层面的落地方式。读完后你将能够准确回答FastAPI 的每个核心特性从哪里来、为什么这样设计并在选型 FastAPI 与同类框架时具备扎实的对比依据。缘起为什么 FastAPI 是集大成者而非凭空创造文档开篇即明确了 FastAPI 的诞生逻辑FastAPI 如果没有替代工具的先前工作就不会存在。作者Sebastián Ramírez在数年里刻意避免创建新框架而是先尝试用现有框架、插件和工具的组合来解决所有需求。最终他发现必须把这些工具中的优秀想法全部吸收进来以尽可能好的方式组合并利用此前无法使用的语言特性Python 3.6 的类型提示才能造出一个新的框架。这个先调研、再综合的过程本身就是一条选型方法论FastAPI 的每个核心能力——自动 API 文档、类型驱动校验、依赖注入、OpenAPI 标准——都能在某个前辈工具身上找到原型。前辈工具一Django 与 Django REST Framework —— 自动 API 文档的起点DjangoDjango 是 Python 生态中最流行、最被广泛信任的 Web 框架之一被 Instagram 这类规模的系统使用过。文档指出了它的两个结构性局限与关系型数据库MySQL、PostgreSQL 等耦合较紧因此把 NoSQL 数据库Couchbase、MongoDB、Cassandra 等作为主存储并不容易为服务端渲染 HTML 而生并不是为构建面向现代前端React、Vue.js、Angular或 IoT 设备通信的 API 而设计的。Django REST Framework (DRF)DRF 是在 Django 之上构建 Web API 的灵活工具包被 Mozilla、Red Hat、Eventbrite 等公司使用。它是自动 API 文档生成的第一个例子——这正是触发作者向FastAPI 方向调研的第一个想法。值得注意的渊源DRF 由 Tom Christie 创建他也是 Starlette 与 Uvicorn 的作者而 Starlette 和 Uvicorn 正是 FastAPI 的基础。也就是说FastAPI 的两大底层组件与自动文档理念出自同一人之手。给 FastAPI 的启发拥有一个能自动生成 API 文档的 Web 用户界面。这一点在当前仓库中有直接落地fastapi/applications.py 中FastAPI的构造函数默认提供docs_url/docs与redoc_url/redoc约 L422-L445并导入 fastapi/openapi/docs.py 的get_swagger_ui_html、get_redoc_html来渲染交互式文档页面OpenAPI 字典本身由 fastapi/openapi/utils.py 中的get_openapi()函数生成。前辈工具二Flask 系 —— 微框架、序列化、解析与文档的插件拼图Flask 与微框架哲学Flask 是微框架microframework它不像 Django 那样内置数据库整合等大量功能正因这种简单与灵活才可能以 NoSQL 数据库作为主存储。文档还提到一个关键观察Flask 的 API 足够简洁适合构建 API那么接下来要找的就是一个Flask 版的 Django REST Framework。给 FastAPI 的启发保持微框架形态让工具和组件可以按需求自由组合保持简单直观的 routing 机制。这个可分离、可扩展的组件化设计在 FastAPI 源码中体现得淋漓尽致fastapi/包按职责拆分为 applications.py应用、routing.py路由、dependencies/依赖注入、security/安全、middleware/中间件等子模块核心能力以可选增强层叠加在 Starlette 之上。Marshmallow早于类型提示的 Schema 定义API 系统的两大基础需求是序列化serialization把 Python 对象数据库记录、datetime等转成可经网络发送的 JSON数据校验validation确认收到的数据合法例如某字段必须是int而非任意字符串。没有校验机制所有检查都要手写。Marshmallow 同时提供这两者但它是在 Python 类型提示出现之前创建的因此定义每个 Schema 都必须使用它自己的类与工具无法直接利用类型系统。给 FastAPI 的启发在代码中定义Schema自动提供数据类型与校验。FastAPI 用 Pydantic 模型 原生类型注解实现了这一思想——这正是Marshmallow 的自动化 类型提示的组合。Webargs请求数据的自动解析与校验API 的另一大需求是对接收到的请求数据query、body 等进行解析。Webargs 是为 Flask 等框架提供该能力的工具内部使用 Marshmallow 做校验且与 Marshmallow 出自同一开发者。作者本人在使用 FastAPI 之前也常用它。给 FastAPI 的启发对接收数据做自动校验。在 FastAPI 中这体现为函数参数的类型注解即校验规则如q: int Query(None, ge0)校验失败时由 fastapi/exception_handlers.py 中的request_validation_exception_handler统一转为 422 响应。APISpec把 Schema 写进 docstring 的痛点Marshmallow Webargs 覆盖了校验、解析、序列化但文档仍缺失于是有了 APISpec同样出自 Marshmallow 开发者之手。它是多框架插件包括 Starlette工作方式是在每个路由函数的docstring 里以 YAML 格式写 Schema 定义再据此生成 OpenAPI Schema。文档指出了这种方式的致命问题在 Python 字符串里嵌入 YAML 这种小语法编辑器无法提供有效辅助当你修改了参数或 Marshmallow Schema 后如果忘记同步更新 docstring 里的 YAML生成的 Schema 就会过期失真。给 FastAPI 的启发支持 OpenAPI 这一开放标准FastAPI 的 OpenAPI Schema 由类型注解直接推导不存在两份定义的失步问题。Flask-apispec作者曾经的最爱全栈Flask-apispec 是把 Webargs、Marshmallow、APISpec 打通的 Flask 插件从 Webargs 和 Marshmallow 的信息自动生成 OpenAPI Schema免去了在 docstring 里手写 YAML 的麻烦。Flask Flask-apispec Marshmallow Webargs 的组合是作者构建 FastAPI 之前的主力后端栈。基于它作者创建过几个 Flask 全栈项目生成器full-stack、full-stack-flask-couchbase、full-stack-flask-couchdb而这些全栈生成器后来又成了 FastAPI 项目生成器的雏形参见 项目生成文档。给 FastAPI 的启发从定义了序列化与校验的代码中自动生成 OpenAPI Schema。前辈工具三NestJS / Sanic / Falcon / Molten / Hug —— 类型提示、高性能与response参数NestJS与 AngularNestJS 是受 Angular 启发的 JavaScriptTypeScriptNode.js 框架实现的能力与 Flask-apispec 相近基于 Angular 2 的集成依赖注入、TypeScript 类型带来的优秀编辑器支持。但文档也指出了它的两个短板TypeScript 类型在编译到 JavaScript 后丢失无法同时依赖类型完成校验、序列化与文档化只能在多处堆叠装饰器代码冗长嵌套模型支持不佳当请求 JSON 体内含嵌套 JSON 对象时难以正确完成文档化与校验。给 FastAPI 的启发利用Python 类型提示获得出色的编辑器辅助Python 类型是运行时存在的天然解决了 TS 类型编译后蒸发的问题构建强大的依赖注入机制同时把代码重复降到最低FastAPI 的Depends无需预先注册见 fastapi/params.py 与 fastapi/dependencies/utils.py。SanicSanic 是基于asyncio的高性能 Python 框架之一结构与 Flask 非常相似。技术细节上它使用uvloop替代标准 asyncio 事件循环以获得极高性能并明显启发了 Uvicorn 与 Starlette而二者如今在公开基准中已快于 Sanic。给 FastAPI 的启发找到了实现高性能的方法——FastAPI 基于经第三方基准测试的高性能框架Starlette正是为了继承这条高性能路线。FalconFalcon 是另一个高性能 Python 框架设计上极简可作为其他框架如 Hug的底层。它的设计约定是端点函数接收两个参数——request与response从 request 读数据、向 response 写数据。这种设计的代价是无法用 Python 标准类型提示把请求参数/Body 声明为函数形参因此数据校验、序列化、文档化都无法自动化只能手写或者像 Hug 那样在 Falcon 之上再包一层框架。给 FastAPI 的启发高性能的参考路径在端点函数上提供response参数与 Hug 一起启发了这一设计。在 FastAPI 中该参数是可选的用于设置响应头、Cookie、状态码等。当前仓库的示例 docs_src/response_headers/tutorial001_py310.py 展示了返回JSONResponse(content..., headers...)的方式而 fastapi/routing.py 中get_request_handler对端点返回值的处理含response_model序列化L301-L511 附近则是在response参数之外的另一条序列化路径。Molten作者构建 FastAPI 初期发现 Molten它的理念与 FastAPI 高度相似基于 Python 类型提示、由类型驱动校验与文档化、内置依赖注入。差异点在于它自带数据校验/序列化/文档化实现而非使用 Pydantic 这类第三方库导致数据模型不易复用基于WSGI 而非 ASGI性能设计上达不到 Uvicorn/Starlette/Sanic 的水平依赖注入需要预先注册且基于声明类型解析——无法为同一类型提供多个组件路由集中在一个地方声明并引用别处的函数更接近 Django而非 Flask/Starlette 的端点函数上方直接放装饰器。给 FastAPI 的启发进而推动了 Pydantic 演进Molten 用模型属性的默认值来定义附加的数据校验这改善了编辑器辅助而当时的 Pydantic 还不支持。作者受其启发推动 Pydantic 部分更新了这类能力如今 Pydantic 已完整支持例如 FastAPI 中q: int Query(None, ge0)这种默认值 校验约束的写法。HugHug 是最早利用 Python 类型提示声明 API 参数类型的框架之一这个漂亮想法启发了后续所有同类工具。它虽然使用自定义类型而非标准 Python 类型但仍是巨大进步同时它也是最早自动生成 JSON 全 API 自定义 Schema 的框架之一不过并非基于 OpenAPI/JSON Schema 标准因此与 Swagger UI 等工具不易集成。此外它还有一个独特功能同一框架既能写 API 又能写 CLI。它基于旧的 WSGI 标准不支持 WebSocket但性能依然出色。给 FastAPI 的启发Hug 部分启发了 APIStar而 APIStar 与 Hug 是作者发现的最有前途的工具触发FastAPI 用 Python 类型提示声明参数、并自动生成 API 定义 Schema的做法启发 FastAPI 提供response形参以设置头与 Cookie。关键转折点APIStar —— FastAPI 的精神前身作者在决定构建 FastAPI 的前夕遇到了APIStar 0.5 版本。它几乎包含了作者寻找的一切是最早用 Python 类型提示声明参数/请求的框架实现之一与 Hug 同期发现且基于 OpenAPI 标准在多处用同一套类型提示同时完成自动数据校验、序列化、OpenAPI Schema 生成性能在当年基准测试中最佳仅次于 Starlette具备依赖注入需预先注册组件当时尚无自动文档 UI但已知可加 Swagger UI缺安全security集成这是它无法完全替换作者全栈生成器功能的原因——作者当时甚至准备为其贡献该功能的 PR。随后项目方向转变开发者同样是 Tom Christie需要专注于 StarletteAPIStar 不再是 Web 框架如今它只是一个OpenAPI 规范校验工具集。给 FastAPI 的启发文档原文只有一句它的存在本身用同一套 Python 类型同时声明数据的校验、序列化、文档化并保持良好的编辑器辅助——这个想法被 FastAPI 完整继承并强化FastAPI 用 Pydantic 类型编辑器辅助更好作者在长期寻找与测试大量替代方案后认定 APIStar 是当时最优选择当 APIStar 不再作为服务器存在、Starlette 诞生并成为更好的基础后这就是构建 FastAPI 的最后一次灵感因此作者把FastAPI 视为 APIStar 的精神继承者在功能与类型系统上做了改进和扩展。FastAPI 实际使用的三大基石Pydantic、Starlette、UvicornPydantic —— 校验、序列化与 Schema 文档化Pydantic 是基于 Python 类型提示定义数据校验、序列化和JSON Schema 形式的文档的库因此极其直观。它的定位与 Marshmallow 相当但基准测试中更快且由于基于类型提示编辑器辅助体验优秀。在 FastAPI 中的用途承担数据校验、数据序列化、基于 JSON Schema 的自动模型文档化——FastAPI 把 Pydantic 产生的 JSON Schema 数据吸收进 OpenAPI Schema除此之外还做很多其他事情。当前仓库的 pyproject.toml 中核心依赖声明为pydantic 2.9.0印证了 FastAPI 与 Pydantic v2 的绑定关系仓库 docs_src/ 下大量示例如 docs_src/pydantic_v1_in_v2/也展示了 Pydantic v1/v2 在 FastAPI 中的兼容方式。Starlette —— 全部 Web 核心的基座Starlette 是轻量的ASGI构建异步 Python Web 应用的新标准框架/工具包专为高性能异步服务设计。它简洁直观、模块化、易于扩展特性包括WebSocket 支持、进程内后台任务、启动/关闭事件、基于 HTTPX 的测试客户端、CORS/GZip/静态文件/流式响应、Session 与 Cookie 支持、100% 测试覆盖率与全量类型注解代码、极少硬依赖。Starlette 提供 Web 微框架的全部基础功能但不提供自动数据校验、序列化与文档化——这正是 FastAPI 在其之上补充的主要能力一切基于 Python 类型提示使用 Pydantic另加依赖注入、安全工具、OpenAPI Schema 生成。关于 ASGI 的技术细节ASGI 由 Django 核心团队开发尚未成为正式的 Python 标准PEP但正在推进中且已被多个工具当作事实标准使用——这大幅改善了互操作性可以从 Uvicorn 切换到其他 ASGI 服务器Daphne、Hypercorn或叠加python-socketio等 ASGI 兼容工具。FastAPI 与 Starlette 的关系在源码中是一行继承fastapi/applications.py 中即为class FastAPI(Starlette)——FastAPI 类直接继承Starlette 类是增强版 Starlette因此 Starlette 能做的事情 FastAPI 都可以直接做。仓库中 fastapi/websockets.py、fastapi/background.py、fastapi/middleware/ 等模块都是对 Starlette 能力的薄封装。Uvicorn —— 推荐的生产 ASGI 服务器Uvicorn 是由 uvloop 与 httptools 构成的高性能 ASGI 服务器。注意它的定位它是服务器而非 Web 框架——不提供路径路由路由是 Starlette/FastAPI 这类框架在其上提供的。FastAPI 推荐 Uvicorn 的理由它是运行 FastAPI 应用的主力 Web 服务器通过命令行选项--workers可运行异步多进程服务器部署细节参见 部署文档。基准测试Uvicorn / Starlette / FastAPI 的差异要理解并比较三者的性能差异官方文档引导读者查看 基准测试文档该文档包含 FastAPI 与 Flask、Django、其他框架的对照基准以及 Uvicorn 与 Gunicornuvicorn 多 worker 模式、不同--workers取值的实测曲线——这正是服务器Uvicorn、框架Starlette、增强层FastAPI三层分工在数字上的直接验证。核心设计思想的收敛总结把文档中各工具给 FastAPI 的启发汇总起来可以提炼出 FastAPI 的五条设计公理每一条都有明确的前辈来源与源码落点FastAPI 核心设计继承自仓库内印证自动生成 API 文档的交互式 UI/docs、/redocDjango REST Framework 首创、Swagger/OpenAPI 标准化fastapi/openapi/utils.py 的get_openapi()fastapi/applications.py 的docs_url/redoc_url微框架、组件可组合Flaskfastapi/ 目录按职责拆分的模块化结构requests.get(...)式的直觉 APIapp.get(...)Requestsdocs_src/first_steps/tutorial001_py310.py类型提示驱动的校验/序列化/文档三位一体Marshmallow Webargs APISpec Hug APIStarPydantic 集成pyproject.toml 中pydantic2.9.0response形参设置头/Cookie/状态码Falcon Hugdocs_src/response_headers/tutorial001_py310.py高性能 ASGI 基座 Uvicorn/uvloopSanic → Uvicorn/Starlettepyproject.toml 中starlette0.46.0class FastAPI(Starlette)Requests 与 FastAPI 的对称关系是文档中一个常被引用的细节Requests 是客户端与 API 通信FastAPI 是服务器构建 API二者互为补充。requests.get(http://example.com/some/url)与 FastAPI 侧的app.get(/some/url)命名高度对应体现简单直觉的 API 合适的默认值 强大的可定制性这一共同美学。结语FastAPI 的设计史就是一部站在十几个前辈肩膀上的工程史DRF 给了自动文档的冲动Flask 给了微框架的骨架Marshmallow/Webargs/APISpec/Flask-apispec 给了从代码生成 Schema的完整拼图NestJS/Hug 验证了类型提示路线Sanic 证明了异步高性能可行Molten 反向推动了 Pydantic 的约束语法而 APIStar 提供了用同一套类型同时做校验、序列化、文档化的终极蓝图。最终 FastAPI 选择Pydantic 负责数据层、Starlette 负责 Web 层类继承、Uvicorn 负责进程层把这条灵感链固化成当前仓库中 fastapi/applications.py 所定义的实现。理解这张设计溯源图是理解 FastAPI 为什么快、易学、可生产的最短路径。【免费下载链接】fastapiFastAPI framework, high performance, easy to learn, fast to code, ready for production项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考