依赖注入😍
一、依赖注入的概念
在你的路径操作函数执行之前,依赖注入操作就会执行
如何理解依赖注入呢?依赖注入就像是你要去餐厅点单吃饭。结果呢?菜还没做好。服务员就先去给你倒杯小甜水,弄点老八蜜汁小零食。最后等了一段时间后,菜好了,你就可以开始吃饭了!
在这个故事里,依赖注入流程可以被简化为
- 先叫服务员点单(
服务员fastapi开始调用依赖) - 吃饭之前不能饿肚子,小零食必须整上!(依赖函数执行!)
- 菜好了,开始做你来餐厅的正事——美美吃饭(路径操作函数开始执行)
二、小demo演示
from fastapi import Dependsfrom typing import Annoateddef 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" 的子依赖项。
部分信息可能已经过时









