Depends 严格说是参数默认值而非 @ 装饰器,但与路由装饰器配套使用,本目录按「声明式注入」一并收录。
0. 一句话定位
| 维度 | 内容 |
|---|---|
| 作用对象 | 函数参数(路由端点 / 其他依赖) |
| 使用场景 | 依赖 |
| 来源 | 第三方 fastapi.Depends |
| 语法形式 | param: T = Depends(get_x) |
段末注释:依赖注入(Dependency Injection,DI) 把 DB 会话、当前用户等横切依赖从业务函数中拆出,由框架解析并注入。
1. 做什么
FastAPI 在调用端点前解析 Depends(...) 声明的依赖树:先执行依赖函数,将返回值注入参数;依赖可嵌套(依赖的依赖);同一请求内相同依赖可缓存(默认 use_cache=True)。
2. 重点参数
| 参数 | 类型 | 默认值 | 作用 | 配置建议 |
|---|---|---|---|---|
dependency |
callable / None |
必填 | 依赖函数或类 | 无参 callable 最常见 |
use_cache |
bool | True |
同请求内是否复用结果 | DB session 通常 True;每次要新对象设 False |
依赖函数常用参数:也可声明 Request、HTTPAuthorizationCredentials 等,FastAPI 自动注入。
类作为依赖:实现 __call__ 的 callable 类。
3. 最小可运行示例
1 | from typing import Annotated |
推荐写法(Python 3.9+)
1 | SettingsDep = Annotated[dict, Depends(get_settings)] |
依赖链
1 | def get_db(): |
4. 常见变体
路由级 / 路由器级依赖
1 | from fastapi import APIRouter |
Security + OAuth2
1 | from fastapi import Security |
yield 依赖(资源清理)
1 | def get_db(): |
5. 适用 / 不适用
适用
- DB Session、当前用户、权限、分页参数等复用逻辑
- 测试时用
app.dependency_overrides[get_db] = fake_db替换依赖
不适用
- 每个请求都不同的纯 Path/Query → 直接函数参数 + 类型注解
- 全局横切(日志、CORS)→ 中间件更合适
6. 易踩坑
Depends(get_db)不要写成Depends(get_db())(后者会立即调用)- 生成器依赖
yield之后的代码在响应发送后执行 teardown - 循环依赖(A 依赖 B、B 依赖 A)会报错,需重构
- 同步依赖函数在
async端点中会在线程池运行(有开销)
7. 近邻替代
| 替代 | 何时用 |
|---|---|
@app.middleware |
全请求横切、不注入业务参数 |
| 全局变量 | 不推荐,难测试 |
手动在端点内 get_db() |
小脚本;大项目用 Depends |