一、什么是依赖注入
依赖注入,就是在视图函数执行之前,先执行一段公共逻辑代码,这段代码处理完毕后,可以吧返回结果交给视图函数使用
适用业务场景
1.复用公共业务逻辑,消除重复代码
2.统一获取数据库连接
3.接口安全校验、参数校验、角色权限判断
4.分页、查询参数统一处理
核心思想:把重复的代码抽离出来做成依赖项,那些接口需要,就在哪个接口注入这个依赖,不用重复每个接口写一遍
二、函数作为依赖项(函数依赖)
把公共逻辑封装成普通函数,使用Depends(函数名)完成注入。
这里示例:多个列表查询接口,都需要
q搜索条件、skip偏移、limit分页条数,就可以抽成公共依赖函数。
from fastapi import FastAPI, Depends from typing import Dict app = FastAPI() # 定义依赖函数:公共查询参数 async def common(q: str | None = None, skip: int = 0, limit: int = 10): return {"q": q, "skip": skip, "limit": limit} # 接口1:获取items #依赖函数返回的是什么类型就写什么类型,这里的是Dict @app.get('/items') async def read_items(common: Dict = Depends(common)): print(common.get('q'), common.get('skip'), common.get('limit')) return {"message": "ok"} # 接口2:获取users,复用同一套依赖 @app.get("/users") async def read_users(common: Dict = Depends(common),skip: int=1): return common提示:视图函数除了注入的依赖,还可以继续写自己独有的查询参数,二者可以共存(如接口2所示)。
三、类作为依赖项(类依赖)
当业务逻辑负责,除了接收参数,还需要封装很多工具方法,就推荐使用类依赖
FastAPI 会自动执行类的
__init__方法,接收 url 查询参数,实例化对象传给接口。
from fastapi import FastAPI, Depends app = FastAPI() fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}] # 类依赖 class CommonQueryParams: def __init__(self, q: str | None = None, skip: int = 0, limit: int = 100): # 接收查询参数,赋值实例属性 self.q = q self.skip = skip self.limit = limit # 类中自定义业务方法 def get_query_params(self): query_params = [] if self.q: query_params = self.q.split(" ") return query_params @app.get("/items/") async def read_items(commons=Depends(CommonQueryParams)): response = {} if commons.q: response.update({"q": commons.q}) items = fake_items_db[commons.skip: commons.skip + commons.limit] response.update({"items": items}) return response @app.get("/books") async def get_books(params=Depends(CommonQueryParams), skip: int = 0): # 可以调用依赖类里面的方法 print(params.q) print(params.get_query_params()) print("接口自身的skip参数:", skip) return {"message": "ok"}关键知识点
Depends(CommonQueryParams),只写类名,不要写括号CommonQueryParams(),FastAPI 会自动实例化。- 拿到的
params是类的实例对象,可以直接访问self属性,调用类内部定义的方法。 - 注入依赖之后,接口依旧可以声明属于自己的独立参数,互不冲突。
四、函数依赖 vs 类依赖怎么选
| 类型 | 适用场景 |
|---|---|
| 函数依赖 | 逻辑简单,只做参数处理、返回字典,不需要封装方法 |
| 类依赖 | 逻辑复杂,需要封装多个业务工具方法,属性较多 |
五、总结
Depends依赖注入核心价值:抽离公共逻辑,消除大量重复代码。- 函数依赖:简单场景,返回字典数据。
- 类依赖:复杂场景,可以拥有实例属性、自定义成员方法。
- 依赖注入参数 + 接口自有参数可以共存,互不干扰。
- 实际项目中,权限校验、获取 db 会话、统一分页,都会大量使用依赖注入。