FastAPI 依赖注入的三种姿势
三种姿势
FastAPI 的依赖注入本质上是「在请求进 handler 之前,先跑一段可复用的逻辑」。
1. 函数依赖
最常用,适合取当前用户、校验 token:
from fastapi import Depends
async def get_current_user(token: str = Header(...)):
return decode(token)
@app.get("/me")
async def me(user=Depends(get_current_user)):
return user
2. 类依赖
需要配置或状态时,把依赖写成类,__call__ 返回结果:
class Paginator:
def __init__(self, size: int = 20):
self.size = size
def __call__(self, page: int = 1):
return {"offset": (page - 1) * self.size, "limit": self.size}
@app.get("/items")
async def items(pager = Depends(Paginator(50))):
return pager
3. 全局依赖
鉴权、限流这类横切逻辑,挂到 app 上一次搞定:
app = FastAPI(dependencies=[Depends(verify_api_key)])
选型速查
| 场景 | 推荐姿势 |
|---|---|
| 请求级数据(用户、租户) | 函数依赖 |
| 带参数的可复用逻辑 | 类依赖 |
| 全局鉴权 / 限流 | 全局依赖 |
循环依赖
A 依赖 B、B 又依赖 A 时,FastAPI 会报 Depends cycle。排查思路:把公共部分抽成第三个依赖,或者改用 yield 依赖拆生命周期。
一句话
能用函数依赖就别上类依赖,能用局部就别挂全局——依赖链越短,报错越好查。