FastAPI(31)- Sub-dependencies 子依赖
子依赖
- 就是嵌套依赖,和嵌套 Pydantic Model 差不多意思
- 可以根据需求创建多层嵌套的依赖关系
比如上图,E 依赖 C、D,C、D 又依赖 B,B 又依赖 A.....
两层依赖的栗子
第一层依赖
from typing import Optional # 1、第一层依赖 def query_extractor(q: Optional[str] = None): return q
就是个普通函数,接收一个 q 参数,类型 str,直接返回 q
第二层依赖
from fastapi import Cookie, Depends, FastAPI from typing import Optional # 1、第一层依赖 def query_extractor(q: Optional[str] = None): return q # 2、第二层依赖 def query_or_cookie_extractor( # 声明依赖项 q: str = Depends(query_extractor), # 另外一个参数,接收 Cookie last_query: Optional[str] = Cookie(None) ): if not q: return last_query return q
- 参数 q 依赖于 query_extractor,并将 query_extractor 的返回值赋值给 q
- 如果没有传 q,则返回 last_query,模拟返回上一次的查询结果
- 如果有传 q,则直接返回 q
路径操作函数声明依赖项
#!usr/bin/env python # -*- coding:utf-8 _*- """ # author: 小菠萝测试笔记 # blog: https://www.cnblogs.com/poloyy/ # time: 2021/9/25 10:26 上午 # file: 27_sub_depend.py """ from typing import Optional import uvicorn from fastapi import Cookie, Depends, FastAPI app = FastAPI() # 1、第一层依赖 def query_extractor(q: Optional[str] = None): return q # 2、第二层依赖 def query_or_cookie_extractor( # 声明依赖项 qq: str = Depends(query_extractor), # 另外一个参数,接收 Cookie last_query: Optional[str] = Cookie(None) ): if not qq: return last_query return qq @app.get("/items/") async def read_query( # 3、声明依赖项 query_or_default: str = Depends(query_or_cookie_extractor) ): return {"q_or_cookie": query_or_default} if __name__ == "__main__": uvicorn.run(app="27_sub_depend:app", host="127.0.0.1", port=8080, reload=True, debug=True)
FastAPI 的执行顺序图
先执行第一层依赖,然后第二层,最后才会执行路径操作函数
查看 Swagger API 文档
正确传参的请求结果
user_cache 的作用
- 默认是 true,表示使用缓存
- 当同一个依赖项被多次调用时,FastAPI 知道每个请求只会调用该依赖项一次
- 它会将返回值保存在缓存中,并将其传给需要它的所有地方,而不会重复调用该依赖项多次
- 当然,如果不想使用缓存的话,可以将 user_cache 设置为 False
async def needy_dependency(fresh_value: str = Depends(get_value, use_cache=False)): return {"fresh_value": fresh_value}
多个路径操作函数声明同一个依赖项