您可以创建具有子依赖关系的依赖关系。
它们可以像您需要的那样
FastAPI将解决这些问题。

第一个依赖项“ dependable”

您可以创建第一个依赖项(“ dependable”),例如:

  1. from fastapi import Cookie, Depends, FastAPI
  2. app = FastAPI()
  3. def query_extractor(q: str = None):
  4. return q
  5. def query_or_cookie_extractor(
  6. q: str = Depends(query_extractor), last_query: str = Cookie(None)
  7. ):
  8. if not q:
  9. return last_query
  10. return q
  11. @app.get("/items/")
  12. async def read_query(query_or_default: str = Depends(query_or_cookie_extractor)):
  13. return {"q_or_cookie": query_or_default}

它声明一个可选的查询参数q作为str,然后返回它。
这很简单(不是很有用),但是将帮助我们专注于子依赖项的工作方式。

第二个依赖项,“ dependable”和“ dependant”

然后,您可以创建另一个依赖项函数(一个“dependable”),该函数同时声明自己的依赖项(因此它也是一个“ dependant”):

  1. from fastapi import Cookie, Depends, FastAPI
  2. app = FastAPI()
  3. def query_extractor(q: str = None):
  4. return q
  5. def query_or_cookie_extractor(
  6. q: str = Depends(query_extractor), last_query: str = Cookie(None)
  7. ):
  8. if not q:
  9. return last_query
  10. return q
  11. @app.get("/items/")
  12. async def read_query(query_or_default: str = Depends(query_or_cookie_extractor)):
  13. 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}

  1. <br />
  2. :::tips
  3. 注意,我们仅在路径操作函数中声明一个依赖项`query_or_cookie_extractor`。<br />但是FastAPI将知道它必须首先解决`query_extractor`,然后在调用它时将其结果传递给`query_or_cookie_extractor`。
  4. :::
  5. <br />
  6. <a name="-2"></a>
  7. ### 使用同样的依赖多次
  8. 例如,如果针对同一路径操作多次声明一个依赖项,例如,多个依赖项具有一个公共的子依赖项,则**FastAPI**将知道每个请求仅调用一次该子依赖项。<br />并且它将返回的值保存在“缓存”中,并将其传递给该特定请求中需要它的所有“依赖项”,而不是针对同一请求多次调用依赖项。<br />在高级场景中,您知道需要在同一请求中的每个步骤(可能多次)上调用依赖项,而不是使用“cached”值,可以在使用`Depends`时设置参数`use_cache=False`:
  9. ```python
  10. async def needy_dependency(fresh_value: str = Depends(get_value, use_cache=False)):
  11. return {"fresh_value": fresh_value}

概括

除了这里使用的所有花哨的单词之外,Dependency Injection系统非常简单。
看起来与路径操作功能相同的功能。
但是,它非常强大,并且允许您声明任意深度嵌套的依赖关系“图形”(树)。

:::tips 这些简单的示例似乎对所有这些都没有用。
但是您将在有关安全性的章节中看到它的用处。
您还将看到它将节省您的代码量。 :::