两年前选 Python Web API 框架,答案大概是 Flask 或者 Django REST Framework。今天再问,越来越多的人会脱口而出:FastAPI。
它不是凭空冒出来的新玩具,而是踩在三个成熟项目肩膀上的集大成者——Starlette 负责高性能 Web 层,Pydantic 担当类型安全的数据层,OpenAPI 和 JSON Schema 把一切串联成完整的 API 开发体验。官方特性清单读起来让人眼花缭乱,但拨开技术术语,真正打动开发者的是几件朴素的事。
打开浏览器就能调接口
写 API 最让人烦躁的不是写代码,是写文档。更烦的是文档写完就过时,和实际接口对不上。
FastAPI 彻底绕开了这个问题——代码写完,文档自动就生成了。路径参数、查询参数、请求体,凡是用类型标注声明过的,框架启动时直接生成 OpenAPI 规范文档,自带 Swagger UI 和 ReDoc 两套交互界面。你在 Swagger UI 里填参数、点调用、看返回,一个 URL 扔给前端同事,他再也不会来问「这个接口怎么调」。
编辑器比你先知道要写什么
整个 FastAPI 框架设计时反复在多个编辑器上测试,目标就一个:让自动补全覆盖每一个角落。效果确实达到了。当你写user.时,IDE 会准确弹出id、name、joined这些 Pydantic 模型里定义过的字段,嵌套 JSON 字段也一样——不需要翻文档,不需要记键名。这听起来不算颠覆性创新,但用起来才知道,少翻一次文档就少一次心流被打断。
验证和序列化,Pydantic 替你做了
Pydantic 可能是 Python 生态里最成功的类型验证库之一。FastAPI 把它深度集成进来,让你用写 Python 类的方式定义数据结构,然后所有的校验、转换、序列化自动完成。
要校验字符串长度,给字段加个min_length就行;要限定数字范围,ge和le一步到位;URL、Email、UUID 这类特殊类型也都有现成的支持。更难得的是它支持任意层级的嵌套模型——一个订单里嵌套用户信息、商品列表、收货地址,数据进来之后自动完成一整个嵌套结构的验证和转换,你不用写一行if isinstance。
依赖注入:写得少,却控制得多
FastAPI 的依赖注入系统是它最被低估的设计亮点。两行代码声明一个依赖,框架自动处理生命周期、参数解析和结果注入,依赖还能嵌套子依赖,形成一张依赖图。
你可以把身份认证、数据库连接池、权限校验各抽成一个依赖,在任何路径操作函数里按需声明。所有依赖都会自动反映在 OpenAPI 文档里。别的框架用路由和中间件也能组合出类似效果,但 FastAPI 这套依赖系统的语法轻量和复用便利,确实是独有的手感。
安全认证自带,不需要自己造轮子
FastAPI 内置了 OpenAPI 定义的所有安全模式:HTTP Basic、OAuth2(含 JWT Token)、API Key(可放请求头、查询参数或 Cookie),以及 Starlette 的 Session Cookie 机制。这些组件全是可复用的工具,不和数据库或用户模型绑定。你只需实现一个获取当前用户的函数,验证流程框架都包好了。
Starlette 的底子,性能不拖后腿
FastAPI 本质上是 Starlette 的子类,所有 Starlette 的能力它都继承了——而 Starlette 是 Python 异步框架里性能第一梯队的存在,和 NodeJS、Go 在同类场景下有得一拼。
除了请求吞吐量,Starlette 还带来了 WebSocket、进程内后台任务、启动关闭事件钩子、CORS 中间件、GZip 压缩、静态文件服务和流式响应。不是花哨的噱头,是真实项目里几乎都会用到的功能。
测试友好,不是附带的安慰剂
FastAPI 代码库本身 100% 类型标注、100% 测试覆盖。内置 TestClient 基于 HTTPX,支持同步和异步两种风格。依赖项可覆盖,数据库可替换,startup 和 shutdown 事件都能在测试里独立验证——不需要为了可测试性去扭曲代码结构,框架本身就是为测试而设计的。
总结一句
FastAPI 不是那种「学一门新语法、换一套新范式」的框架。它就是现代 Python:类型标注、异步支持、自动文档、IDE 友好。如果你已经会写 Python 类型,那你大概已经会了一半 FastAPI。
Starlette 给了它高性能的 Web 层,Pydantic 给了它安全可靠的数据层,OpenAPI 给了它标准化的接口描述能力。三个已经成熟的项目各司其职,FastAPI 做的是把三者缝合得自然顺畅——这缝合本身,就是它最值钱的地方。