zoukankan      html  css  js  c++  java
  • 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}

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

  • 相关阅读:
    团购的玩法 要粘性也要乐趣
    风讯CMS提交时出现System.Web.HttpRequestValidationException (0x80004005):错误
    关于传统零售企业网上经营模式的探讨
    一个很漂亮的转入别的页面时等待页
    采集百度图片
    带有立体感的凹陷字体,非常夺人眼球
    sql2005 远程连接问题解决方法
    草根创业:接纳与淘汰终归“剩”者为王
    写一个属于自己的模板引擎(1)
    写一个属于自己的模板引擎(2)
  • 原文地址:https://www.cnblogs.com/poloyy/p/15332992.html
Copyright © 2011-2022 走看看