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 依赖拆生命周期。

💡
一句话

能用函数依赖就别上类依赖,能用局部就别挂全局——依赖链越短,报错越好查。

目录

图表