在 Python Web 框架层出不穷的当下,FastAPI 用短短几年时间冲到了 GitHub 约 87k Star 的位置,成为构建 API 服务的事实首选之一。它由 Sebastián Ramírez(tiangolo)创建,基于 Starlette 与 Pydantic,核心理念是:用 Python 类型注解驱动一切——路由参数校验、序列化、文档生成全部自动完成。本文先讲清它的定位与特性,再给出可运行的快速上手代码,然后深入依赖注入与异步机制,最后对比选型并给出行动建议。
1、项目概述
FastAPI 是一个现代、高性能的 Python Web 框架,用于基于标准类型注解构建 API,采用 MIT 协议开源,仓库地址为 fastapi/fastapi。它的底层由两个组件构成:ASGI 服务器层面的 Starlette 负责 Web 请求处理,数据层面的 Pydantic 负责验证与序列化,FastAPI 在两者之上做了优雅的整合。
官方 README 列出的核心特性包括:
- 高性能,与 NodeJS、Go 相当
- 开发速度快,bug 更少
- 直观易学,代码简洁健壮
- 基于 OpenAPI 与 JSON Schema 开放标准
- 自动生成交互式 API 文档
- 类型安全,编辑器补全友好
安装只需一条命令(项目使用 uv 管理依赖时):
uv add "fastapi[standard]"
[standard] 附带会拉取 uvicorn 服务器与常用依赖;如果用 pip,对应命令是 pip install "fastapi[standard]"。装好后即可用 fastapi dev 启动开发服务器,带热重载。
2、快速上手
下面是 README 中的官方示例,一个最小可运行的 API 服务:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str | None = None):
return {"item_id": item_id, "q": q}
将代码保存为 main.py,执行 fastapi dev main.py,服务就在 http://127.0.0.1:8000 跑起来了。这个例子浓缩了 FastAPI 的三个关键点:FastAPI() 实例化应用;@app.get 等装饰器声明路由与 HTTP 方法;item_id: int 这样的类型注解会自动完成参数解析、类型转换与校验——传入非数字直接返回 422 错误,无需手写一行校验代码。
更省事的是,启动服务后访问 /docs 会得到自动生成的 Swagger UI 交互页面,/redoc 则是 ReDoc 风格文档。接口改了文档即时更新,前后端协作时这一点极为省心。
3、数据验证与 Pydantic
FastAPI 的验证体系直接复用 Pydantic 的 BaseModel。定义一个请求体模型:
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
is_offer: bool | None = None
在路由函数里把 Item 作为参数类型声明,FastAPI 就会自动读取 JSON 请求体、逐字段校验、给出带位置信息的错误提示。模型实例可直接返回,序列化为 JSON 响应也是自动的。响应模型的声明同样靠类型注解:给装饰器传 response_model=Item,输出字段会被过滤和验证,避免意外泄漏敏感字段。这套机制的好处是"一次声明,处处生效"——校验逻辑、文档 schema、编辑器类型提示来自同一份代码。
4、依赖注入与异步
Depends 是 FastAPI 的依赖注入入口。认证取当前用户、获取数据库会话这类横切逻辑,写成一个函数后通过参数注解注入:
async def get_current_user(token: str):
return await decode_token(token)
@app.get("/me")
async def read_me(user=Depends(get_current_user)):
return user
依赖可以嵌套,FastAPI 会自动解析整棵依赖树,并对同一请求内的重复依赖做缓存。
异步方面,路由函数声明为 async def 即可使用 await 处理 I/O,底层走 Starlette 的 ASGI 事件循环。对数据库、外部 API 密集型的服务,异步能把单进程吞吐拉高数倍。注意两点:函数内不能有阻塞调用(如同步的 requests),否则会卡住整个事件循环;存量同步代码直接用 def 声明即可,FastAPI 会把它放进线程池执行,两种风格可以混用。
5、选型对比与注意事项
和 Flask 相比,FastAPI 自带验证、文档与异步支持,Flask 需要自行拼装 Marshmallow、APISpec 等组件;和 Django 相比,FastAPI 不含 ORM、Admin、迁移等全家桶,适合纯 API 微服务,Django 更适合需要后台管理与完整 MVC 的单体应用。性能上 FastAPI 在 Python 框架里属第一梯队,但真正的高性能来自异步化的 I/O 模型而非计算本身。
实践中的注意事项:
- 生产部署用
fastapi run或uvicorn --workers N,多 worker 利用多核 - 长任务交给 Celery 等任务队列,不要塞进请求处理
- 版本化 API 时善用路由前缀与
APIRouter拆分模块 - 中间件与异常处理器统一处理日志、限流和错误格式
6、总结
FastAPI 把"类型注解"这一个 Python 特性用到了极致:路由、验证、文档、依赖注入全部围绕它展开,开发体验和工程质量兼得,约 87k 的 Star 数是社区用脚投票的结果。对于新建的 API 服务、机器学习模型上线、微服务拆分场景,建议直接选 FastAPI 并全面使用 async 路由与 Pydantic 模型;对于重后台管理、重模板渲染的传统 Web 应用,Django 仍是更合适的选择。入门资源首推官方文档,其中文版由社区维护,质量相当高。

