FastAPI(31)- Sub-dependencies 子依赖

简介: FastAPI(31)- Sub-dependencies 子依赖

子依赖


  • 就是嵌套依赖,和嵌套 Pydantic Model 差不多意思
  • 可以根据需求创建多层嵌套的依赖关系


image.png


比如上图,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 的执行顺序图

image.png

先执行第一层依赖,然后第二层,最后才会执行路径操作函数

 

查看 Swagger API 文档

image.png

正确传参的请求结果


image.png

user_cache 的作用


image.png

  • 默认是 true,表示使用缓存
  • 当同一个依赖项被多次调用时,FastAPI 知道每个请求只会调用该依赖项一次
  • 它会将返回值保存在缓存中,并将其传给需要它的所有地方,而不会重复调用该依赖项多次
  • 当然,如果不想使用缓存的话,可以将 user_cache 设置为 False

async def needy_dependency(fresh_value: str = Depends(get_value, use_cache=False)):

   return {"fresh_value": fresh_value}

 

多个路径操作函数声明同一个依赖项

image.png

相关文章
|
Python
FastAPI(35)- 依赖项中使用 yield + Context Manager 上下文管理器
FastAPI(35)- 依赖项中使用 yield + Context Manager 上下文管理器
261 0
FastAPI(33)- Global Dependencies 全局依赖
FastAPI(33)- Global Dependencies 全局依赖
299 0
FastAPI(33)- Global Dependencies 全局依赖
FastAPI(32)- Dependencies in path operation 通过路径操作装饰器的 dependencies 参数声明依赖
FastAPI(32)- Dependencies in path operation 通过路径操作装饰器的 dependencies 参数声明依赖
141 0
FastAPI(32)- Dependencies in path operation 通过路径操作装饰器的 dependencies 参数声明依赖
FastAPI 学习之路(二十六)全局依赖项
FastAPI 学习之路(二十六)全局依赖项
FastAPI 学习之路(二十六)全局依赖项
|
测试技术
FastAPI 学习之路(二十五)路径操作装饰器依赖项
FastAPI 学习之路(二十五)路径操作装饰器依赖项
FastAPI 学习之路(二十五)路径操作装饰器依赖项
|
缓存
FastAPI 学习之路(二十四)子依赖项
FastAPI 学习之路(二十四)子依赖项
FastAPI 学习之路(二十四)子依赖项
|
Python
FastAPI 学习之路(二十三)用类作为依赖的注入
FastAPI 学习之路(二十三)用类作为依赖的注入
FastAPI 学习之路(二十三)用类作为依赖的注入
|
监控 安全 NoSQL
FastAPI 学习之路(二十二)依赖项
FastAPI 学习之路(二十二)依赖项
FastAPI 学习之路(二十二)依赖项
|
缓存
fastapi 路径依赖项Depends / 装饰器依赖dependencies / 全局依赖 / 带 yield 的依赖
fastapi 路径依赖项Depends / 装饰器依赖dependencies / 全局依赖 / 带 yield 的依赖
412 0
fastapi 路径依赖项Depends / 装饰器依赖dependencies / 全局依赖 / 带 yield 的依赖
|
NoSQL 测试技术 Redis
FastAPI(八十四)实战开发《在线课程学习系统》--接口测试(下)
FastAPI(八十四)实战开发《在线课程学习系统》--接口测试(下)
FastAPI(八十四)实战开发《在线课程学习系统》--接口测试(下)