mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
861 字
2 分钟
Fastapi依赖注入
2026-03-26

依赖注入😍#

一、依赖注入的概念#

在你的路径操作函数执行之前,依赖注入操作就会执行

如何理解依赖注入呢?依赖注入就像是你要去餐厅点单吃饭。结果呢?菜还没做好。服务员就先去给你倒杯小甜水,弄点老八蜜汁小零食。最后等了一段时间后,菜好了,你就可以开始吃饭了!

在这个故事里,依赖注入流程可以被简化为

  • 先叫服务员点单(服务员fastapi开始调用依赖)
  • 吃饭之前不能饿肚子,小零食必须整上!(依赖函数执行!)
  • 菜好了,开始做你来餐厅的正事——美美吃饭(路径操作函数开始执行)

二、小demo演示#

from fastapi import Depends
from typing import Annoated
def a():
print("手术医生和工具已经就位!")
return {"工具":“麻药”,“医生”:“班导”}
@app.get("/")
async def b(item:Annotated[a,Depends()])
print("我草!不要过来啊!")
print(f"{b["医生"]}拿着{b[“工具”]来噶你的小腰子}"")
return {"status":"往后再无雄风😭"}
输出结果:
手术医生和工具已经就位
我草,不要过来啊!
班导拿着麻醉来噶你的小腰子

从以上这个案例里面,我们可以看到,班导我草也太坏了······

咳咳,回到正题!

我们可以看到,依赖注入函数可以放在路径操作函数的参数里,并且会在其执行之前开始执行。

当然,路径操作函数不止可以放在那里,它的位置有以下几种情况

  • 路径操作函数的参数

  • 路由的参数

  • 全局路由的参数

    app = FastAPI(dependencies=[Depends(verify_token)])

    这个时候就有人要问了,珠宝珠宝,依赖注入的只能是函数吗???

    那么好,我就直接告诉你!不是!

    依赖注入还可以是一个类

三、依赖注入类#

class CommonQueryParams:
def __init__(self, q: str | None = None, skip: int = 0, limit: int = 100):
self.q = q
self.skip = skip
self.limit = limit
class Dog:
def __init__(self,q:str|None=None,fat:bool=True)
self.q =q
self.fat = fat
@app.get("/")
async def nbdog(dog:Annotated[Dog,Depends()])
print(dog.q)

实现的原理就是,fastapi会自动检测你注入的东西的类型,你要是注入一个类的话,那么fastapi就会自动帮你生成一个实例化对象并传给形参!

四、多个子依赖项#

依赖项之间可以互相套用,我是懒狗,懒得写了,其实和上面差不多的。

五、利用生成器来解决事物#

async def get_db():
db = DBSession()
try:
yield db
finally:
db.close()

这种数据据库可以利用生成器并作为依赖注入项来实现crud操作!

带有 yield 的依赖项的退出代码会在响应发送给客户端 之后 执行。

但是,如果您知道在从 路径操作函数 返回后不再需要使用该依赖项,您可以使用 Depends(scope="function") 来告诉 FastAPI 它应该在 路径操作函数 返回后、但在响应发送之前 关闭该依赖项。

  • "function":在处理请求的 路径操作函数 之前启动依赖项,在 路径操作函数 结束之后、但在响应发送回客户端之前 结束依赖项。因此,依赖项函数将在 路径操作 函数 的周围 执行。
  • "request":在处理请求的 路径操作函数 之前启动依赖项(与使用 "function" 时类似),但在响应发送回客户端 之后 结束。因此,依赖项函数将在 请求 和响应周期 的周围 执行。

如果未指定并且依赖项带有 yield,则默认情况下其 scope"request"

当您声明一个带有 scope="request"(默认值)的依赖项时,任何子依赖项也必须具有 scope"request"

但是,一个带有 scope"function" 的依赖项可以有 scope"function"scope"request" 的子依赖项。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Fastapi依赖注入
https://fatdog.20060113.xyz/posts/lujingyilai/
作者
神秘大胖狗
发布于
2026-03-26
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00