news 2026/8/23 23:00:19

依赖注入 Depends

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
依赖注入 Depends

一、什么是依赖注入

依赖注入,就是在视图函数执行之前,先执行一段公共逻辑代码,这段代码处理完毕后,可以吧返回结果交给视图函数使用

适用业务场景

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"}

关键知识点

  1. Depends(CommonQueryParams),只写类名,不要写括号CommonQueryParams(),FastAPI 会自动实例化。
  2. 拿到的params是类的实例对象,可以直接访问self属性,调用类内部定义的方法。
  3. 注入依赖之后,接口依旧可以声明属于自己的独立参数,互不冲突。

四、函数依赖 vs 类依赖怎么选

类型适用场景
函数依赖逻辑简单,只做参数处理、返回字典,不需要封装方法
类依赖逻辑复杂,需要封装多个业务工具方法,属性较多

五、总结

  1. Depends依赖注入核心价值:抽离公共逻辑,消除大量重复代码。
  2. 函数依赖:简单场景,返回字典数据。
  3. 类依赖:复杂场景,可以拥有实例属性、自定义成员方法。
  4. 依赖注入参数 + 接口自有参数可以共存,互不干扰。
  5. 实际项目中,权限校验、获取 db 会话、统一分页,都会大量使用依赖注入。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/23 22:49:20

盘立方软件指标公式倚天财经指标

110,COLORBLACK; 0,COLORBLACK; VAR26:(CLOSE-LLV(LOW,30))/(HHV(HIGH,30)-LLV(LOW,30))*100; VAR27:REVERSE(VAR26); VAR28:SMA(VAR26,3,1); 神通:SMA(VAR28,3,1),COLORCYAN; 标王:SMA(神通,3,1),COLORYELLOW; DRAWTEXT(CROSS(神通,标王) AND 神通<40,100,公),COLORWHITE; …

作者头像 李华
网站建设 2026/8/23 22:37:48

TortoiseGit图形化Git工具:从安装配置到首次提交完整指南

1. 为什么选择TortoiseGit&#xff1a;从命令行恐惧到图形化掌控如果你和我一样&#xff0c;第一次接触Git时&#xff0c;面对黑漆漆的命令行窗口和一堆git add、git commit、git push命令感到头皮发麻&#xff0c;那么TortoiseGit可能就是你的“救星”。它不是Git的替代品&…

作者头像 李华
网站建设 2026/8/23 22:33:10

Axios超时配置全解析:从原理到实战的精细化请求管理

1. 项目概述&#xff1a;为什么超时配置是前端开发的“生命线”在前后端分离的开发模式下&#xff0c;前端应用通过HTTP请求与后端API进行数据交互是家常便饭。作为前端开发者&#xff0c;我们几乎每天都在和axios打交道。但你是否遇到过这样的场景&#xff1a;某个查询复杂报表…

作者头像 李华
网站建设 2026/8/23 22:31:35

python的运筹学工业场景模拟第八十九篇:汇总灵敏度全部测算结果,整理成通俗易懂业务表格,屏蔽数学符号,适配管理者阅读。

灵敏度分析“翻译机”&#xff1a;把影子价格变成厂长听得懂的“调价清单”“某化工厂用 PuLP 建了线性规划模型&#xff0c;算出来每月最优利润 420 万。我问求解器&#xff1a;‘如果原料涨价 10%&#xff0c;利润会掉多少&#xff1f;’ 求解器吐出来一堆‘对偶值、检验数、…

作者头像 李华
网站建设 2026/8/23 22:30:45

财政增量政策的底层逻辑:慢就是新的快

《30万亿之后&#xff0c;财政真正的悬念才开始》——最积极的财政&#xff0c;不是花钱最多&#xff0c;而是把钱变成确定性过去拼的是谁敢加杠杆&#xff0c;未来拼的是谁能把钱花到刀刃上。今年财政支出首破30万亿&#xff0c;新增政府债券11.89万亿&#xff0c;转移支付连续…

作者头像 李华