持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情
嵌套使用依赖注入
- 依赖注入可能被前嵌套使用,意思就是说,你可以再使用依赖注入时,被依赖的对象内部继续使用依赖注入,并且依赖注入嵌套的深入不受限制。
from typing import Union
from fastapi import Cookie, Depends, FastAPI
app = FastAPI()
def query_extractor(q: Union[str, None] = None):
return q
def query_or_cookie_extractor(
q: str = Depends(query_extractor),
last_query: Union[str, None] = Cookie(default=None),
):
if not q:
return last_query
return q
@app.get("/items/")
async def read_query(query_or_default: str = Depends(query_or_cookie_extractor)):
return {"q_or_cookie": query_or_default}
- 比如上面的例子,我们再路径操作函数中定义的
query_or_default
使用了依赖注入, - 此时在执行路径操作函数前会先执行:query_or_cookie_extractor函数,但是这个函数内部定义的
q
也使用了依赖注入 - 此时,在执行query_or_cookie_extractor之前,会先执行query_extractor这个函数
- 于是,我们使用了两层依赖注入,最终在进入路径操作函数之前,调用了两个依赖注入对象。
依赖注入存在缓存
- 当我们在一个路径操作函数多次使用同一个依赖注入时,默认会存在依赖注入执行结果的缓存效应
- 这种缓存效果有时是我们需要的,但我又也是我们想要避免的。
from fastapi import Depends, FastAPI
app = FastAPI()
def get_limit(limit: int):
print(limit)
return limit
@app.get("/items")
async def read_query(limit1: int = Depends(get_limit), limit2: int = Depends(get_limit)):
return {"limit1": limit1, "limit2": limit2}
- 对于上面这个例子,我们在路径操作函数内使用了两次依赖注入get_limit,
- 此时我们可以观察终端输出,只会输出一次limit的值,这是因为第二次使用依赖注入get_limit时,不会再执行这个函数,而是在第一只执行的时候把这个函数的返回值缓存起来,第二次再执行的时候会直接冲缓存中拿出来不在执行函数。
- 那如果你确实不想要使用缓存,也可以指定不使用缓存,通过
use_cache=False
@app.get("/items")
async def read_query(limit1: int = Depends(get_limit), limit2: int = Depends(get_limit, use_cache=False)):
return {"limit1": limit1, "limit2": limit2}
\