您可以创建具有子依赖关系的依赖关系。
它们可以像您需要的那样深。
FastAPI将解决这些问题。
第一个依赖项“ dependable”
您可以创建第一个依赖项(“ dependable”),例如:
from fastapi import Cookie, Depends, FastAPIapp = FastAPI()def query_extractor(q: str = None):return qdef query_or_cookie_extractor(q: str = Depends(query_extractor), last_query: str = Cookie(None)):if not q:return last_queryreturn q@app.get("/items/")async def read_query(query_or_default: str = Depends(query_or_cookie_extractor)):return {"q_or_cookie": query_or_default}
它声明一个可选的查询参数q作为str,然后返回它。
这很简单(不是很有用),但是将帮助我们专注于子依赖项的工作方式。
第二个依赖项,“ dependable”和“ dependant”
然后,您可以创建另一个依赖项函数(一个“dependable”),该函数同时声明自己的依赖项(因此它也是一个“ dependant”):
from fastapi import Cookie, Depends, FastAPIapp = FastAPI()def query_extractor(q: str = None):return qdef query_or_cookie_extractor(q: str = Depends(query_extractor), last_query: str = Cookie(None)):if not q:return last_queryreturn q@app.get("/items/")async def read_query(query_or_default: str = Depends(query_or_cookie_extractor)):return {"q_or_cookie": query_or_default}
让我们关注声明的参数:
- 即使此函数本身是一个依赖项(“ dependable”),它也声明了另一个依赖项(它“依赖”其他东西)。
- 它取决于query_extractor,并将其返回的值分配给参数
q。 - 它还将可选的last_query cookie声明为str。
- 想象一下,如果用户不提供任何查询q,我们仅使用上次使用的查询,该查询之前已保存到cookie中。
使用依赖
然后,我们可以将依赖项用于: ```python from fastapi import Cookie, Depends, FastAPI
app = FastAPI()
def query_extractor(q: str = None): return q
def query_or_cookie_extractor( q: str = Depends(query_extractor), last_query: str = Cookie(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}
<br />:::tips注意,我们仅在路径操作函数中声明一个依赖项`query_or_cookie_extractor`。<br />但是FastAPI将知道它必须首先解决`query_extractor`,然后在调用它时将其结果传递给`query_or_cookie_extractor`。:::<br /><a name="-2"></a>### 使用同样的依赖多次例如,如果针对同一路径操作多次声明一个依赖项,例如,多个依赖项具有一个公共的子依赖项,则**FastAPI**将知道每个请求仅调用一次该子依赖项。<br />并且它将返回的值保存在“缓存”中,并将其传递给该特定请求中需要它的所有“依赖项”,而不是针对同一请求多次调用依赖项。<br />在高级场景中,您知道需要在同一请求中的每个步骤(可能多次)上调用依赖项,而不是使用“cached”值,可以在使用`Depends`时设置参数`use_cache=False`:```pythonasync def needy_dependency(fresh_value: str = Depends(get_value, use_cache=False)):return {"fresh_value": fresh_value}
概括
除了这里使用的所有花哨的单词之外,Dependency Injection系统非常简单。
看起来与路径操作功能相同的功能。
但是,它非常强大,并且允许您声明任意深度嵌套的依赖关系“图形”(树)。
:::tips
这些简单的示例似乎对所有这些都没有用。
但是您将在有关安全性的章节中看到它的用处。
您还将看到它将节省您的代码量。
:::
