推荐答案
FastAPI 的依赖注入系统通过 Python 的类型注解和依赖项函数来实现。依赖项函数可以是一个普通的 Python 函数,也可以是异步函数。FastAPI 会自动解析这些依赖项,并在需要时注入到路径操作函数中。依赖注入系统的主要特点包括:
- 依赖项声明:通过函数参数的类型注解声明依赖项。
- 依赖项解析:FastAPI 自动解析依赖项,并确保它们在路径操作函数执行前被调用。
- 依赖项共享:依赖项可以在多个路径操作函数之间共享,避免重复代码。
- 依赖项层级:依赖项可以嵌套,形成依赖项层级结构。
本题详细解读
1. 依赖项声明
在 FastAPI 中,依赖项通常通过函数参数的类型注解来声明。例如:
// www.javascriptcn.com code example
from fastapi import Depends, FastAPI
app = FastAPI()
def common_parameters(q: str = None, skip: int = 0, limit: int = 100):
return {"q": q, "skip": skip, "limit": limit}
@app.get("/items/")
async def read_items(commons: dict = Depends(common_parameters)):
return commons在这个例子中,common_parameters 函数是一个依赖项,它通过 Depends 注入到 read_items 路径操作函数中。
2. 依赖项解析
FastAPI 会自动解析依赖项,并确保它们在路径操作函数执行前被调用。例如,在上面的代码中,common_parameters 函数会在 read_items 函数执行前被调用,并将结果传递给 read_items 函数。
3. 依赖项共享
依赖项可以在多个路径操作函数之间共享。例如:
@app.get("/users/")
async def read_users(commons: dict = Depends(common_parameters)):
return commons在这个例子中,common_parameters 依赖项被 read_items 和 read_users 两个路径操作函数共享。
4. 依赖项层级
依赖项可以嵌套,形成依赖项层级结构。例如:
// www.javascriptcn.com code example
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}在这个例子中,query_or_cookie_extractor 依赖项依赖于 query_extractor 依赖项,形成了依赖项层级结构。