fastapi之依赖注入(中)

89 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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}

\