跳到正文

从 Node.js 到 FastAPI

会用 Express 或 Koa,再读 FastAPI 的接口,路由方法并不陌生。真正需要重新建立认识的是处理函数的调用约定:没有固定的 req、res 参数,函数可以直接声明登录用户、数据库会话、查询参数和模型请求体。框架从哪里取得这些值,又在什么时候执行校验、依赖和响应处理,是这组文章围绕的问题。

这里选择官方 Full Stack FastAPI Template 作为具体项目。它有用户、登录和 Item 的基本业务,能用同一组对象观察应用入口、请求解析、身份依赖和测试。源码固定在 f4bcfaba7c85be3c6332cc74a20819f586dcdbc6,后续上游演进可从这份基线对照,不把主分支的新行为混进同一份解释。

读者可以默认熟悉 HTTP、JSON、Express / Koa 的轻量路由和数据库;Python 特有的装饰器、类型注解、Annotated 和 yield 会在使用位置解释。Node.js 示例用于迁移已有经验,标注为对照示例的代码不属于模板源码。本文不讨论 ORM 选型或完整生产部署。

由于篇幅问题,全文分成 6 部分来讲。

第一篇《应用入口与请求处理》从缺少 app.listen() 的入口开始,解释 ASGI 服务器与 FastAPI 的分工、模块加载时的注册,以及处理函数返回值如何进入响应流程。普通 def 与 async def 的执行方式也放在这条链路中说明。

第二篇《路由组织与参数来源》拼出 Item 接口的完整 URL,再沿函数签名识别路径参数、查询参数、模型请求体和依赖。参数名、类型、默认值与显式声明怎样共同决定取值,是这一篇的重点。

第三篇《请求模型与响应边界》解释 Pydantic / SQLModel 在 API 边界的职责。创建、更新、数据库实体和公开输出为何分开,以及省略字段、显式 null、请求校验和响应校验的区别,都通过模板的模型展开。

第四篇《依赖注入与登录用户》展开 SessionDep 和 CurrentUser,追踪当前用户需要的会话、Bearer Token 和身份检查。依赖图、请求内缓存、yield 清理与中间件的区别分别配图说明。

第五篇《沿着 Item 接口读完整请求》阅读完整的创建与详情函数,观察输入、认证、资源归属、权限和响应边界怎样协作。模板当前的状态码、部分更新行为和失败发生的位置也会明确区分。

第六篇《用接口测试验证框架行为》区分 pytest fixture 与 FastAPI Depends,解释 TestClient 实际覆盖到哪里。原有 fixture 使用真实数据库且会清理数据,因此配套实验使用独立应用,只验证框架机制,不接触模板数据库。

项目在这份提交中要求 Python 3.14,锁定 FastAPI 0.141.1、Pydantic 2.13.5、Starlette 1.3.1。完整运行模板的依赖、迁移和启动命令以这份后端 README为准;只验证文章中的参数和依赖机制,可以直接使用第六篇的独立实验。

同一组问题还可以对照Go Web / Memos 系列和Spring MVC / Petclinic 系列。三组都沿入口、参数、输入输出、对象与上下文、完整请求、测试展开;Memos 使用 Proto 与传输适配,Petclinic 主要处理表单和页面,可以据此观察不同框架把哪些工作放在了业务函数之外。