FastAPI依赖注入系统完全指南
📂 所属阶段:第二阶段 — 进阶黑科技(核心篇)
🔗 相关章节:FastAPI异步编程深度解析 · FastAPI中间件应用
目录
什么是依赖注入?
不用依赖注入的痛点
假设要写多个需要用户认证的路由:
核心问题:代码复用率低、修改成本高、可测试性差。
用依赖注入解决
FastAPI的依赖注入通过Depends让路由声明式地告诉系统“我需要什么”,而不是自己去获取:
核心优势
- 代码复用:公共逻辑只需定义一次
- 解耦清晰:路由只关注业务逻辑
- 可测试性强:依赖可轻松替换为模拟对象
- 维护成本低:修改一处即可生效
- 内置优化:请求级缓存避免重复执行
基础用法
1. Depends函数详解
Depends(可调用对象)是FastAPI依赖注入的核心,参数可以是普通函数、异步函数、类、生成器。
2. 带Query/Path的依赖工厂
依赖本身也可以接受FastAPI的验证参数(如Query、Path):
3. 类作为依赖
类依赖更适合封装复杂逻辑(如服务类),FastAPI会自动调用__init__实例化:
数据库连接与依赖
依赖注入是管理数据库连接的最佳实践,天然支持连接池复用和自动清理。
异步SQLAlchemy依赖示例
使用yield返回资源,请求结束后自动执行后续清理代码:
依赖链与级联
依赖可以嵌套其他依赖,形成清晰的依赖链(如:提取Token → 验证用户 → 检查权限)。
三层认证授权依赖链示例
可选依赖与默认值
使用Optional可以创建可选依赖,适合公开/私有混合的接口。
依赖缓存机制
1. 默认请求级缓存
同一请求中多次使用同一个依赖,只执行一次,避免重复查询/计算:
2. 禁用缓存:use_cache=False
如果需要每次获取新的结果(如随机数、实时ID),可以禁用缓存:
实战:认证授权体系
依赖分层设计
核心代码示例
进阶用法
1. 全局路由级依赖
在APIRouter或单独的路由参数中添加dependencies,可以让一组路由共用前置依赖:
避坑指南与性能优化
避坑指南
- 避免副作用:依赖函数应该是纯函数或幂等函数
- 避免循环依赖:不要让A依赖B,B又依赖A
- 避免过度嵌套:依赖链不要超过3-4层
- 避免异步依赖中的阻塞操作:把阻塞代码移到线程池
性能优化
- 善用默认请求级缓存:减少重复查询
- 配置合理的数据库连接池:避免连接耗尽
- 依赖执行顺序优化:把快速验证的依赖放在前面(如Token格式检查),快速失败
总结
💡 核心思想:依赖注入让代码变得可测试、可复用、声明式、易维护,是构建企业级FastAPI应用的核心工具。
🔗 官方扩展阅读

