zoukankan      html  css  js  c++  java
  • FastAPI 依赖注入系统(三) 子依赖项

    作者:麦克煎蛋   出处:https://www.cnblogs.com/mazhiyong/ 转载请保留这段声明,谢谢!

    我们可以创建有子依赖项的依赖项,具体依赖深度不受限制。

    FastAPI会处理好依赖项之间的关系。

    我们先声明第一个依赖项函数:

    def query_extractor(q11: str, q12: str):
        return q11 + q12

    然后声明第二个依赖项函数:

    def query_or_cookie_extractor(q2: str = Depends(query_extractor), last_query: str = Cookie(None)):
        if not q2:
            return last_query
        return q2

    在第二个依赖项函数中,同时又声明了它对第一个依赖项函数的依赖。

    完整示例:

    from fastapi import Cookie, Depends, FastAPI
    
    app = FastAPI()
    
    
    def query_extractor(q11: str, q12: str):
        return q11 + q12
    
    
    def query_or_cookie_extractor(q2: str = Depends(query_extractor), last_query: str = Cookie(None)):
        if not q2:
            return last_query
        return q2
    
    
    @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

    但FastAPI知道它必须首先解决第一个依赖项query_extractor,然后把结果传递给第二个依赖项。

    通过可交互式文档,我们可以直观的看到实际路径参数:

    通过可交互式文档我们可以及时进行文档查看以及代码调试。

    依赖项的多次调用

    如果某个依赖项在同一个路径操作中被声明了多次,例如,多个依赖项都有一个共同的子依赖项,那么FastAPI默认在每一次请求中只会调用这个依赖项一次。

    FastAPI会把这个依赖项的返回值缓存起来,然后把这个值传递给需要的依赖项,而不是在同一个请求中多次调用这个依赖项。

    在有些场景下,我们并不需要缓存这个依赖项的返回值,而是需要多次调用,那么我们可以使用参数use_cache=False来禁止依赖项的缓存。

    async def needy_dependency(fresh_value: str = Depends(get_value, use_cache=False)):
    return {"fresh_value": fresh_value}
  • 相关阅读:
    TAM安装需求和过程
    【转】OpenCV灰色直方图
    【原】Windows编程中的字符集编码格式及_T宏的解释
    【转】拷贝构造函数/深拷贝/浅拷贝
    【转】OpenCV实现KNN算法
    【原】opencv中cvCopy()和cvCloneImage()的区别:
    【转】数据挖掘十大经典算法KNN
    【原】函数返回一个指针以及返回STL对象的问题
    【原】关于c中int a=1; int b=a类型问题的思考
    【转】AfxMessageBox、MessageBox、::MessageBox的区别
  • 原文地址:https://www.cnblogs.com/mazhiyong/p/13066271.html
Copyright © 2011-2022 走看看