FastApi教程|高级依赖

发表时间:2020-03-09

参数依赖

我们看到的所有依赖项都是固定的函数或类。

但是在某些情况下,您可能希望能够在依赖项上设置参数,而不必声明许多不同的函数或类。

假设我们想要一个依赖项来检查查询参数是否 q 包含一些固定内容。

但是我们希望能够参数化该固定内容。

“可调用”实例

在Python中,有一种方法可以将类的实例设为“可调用的”。

不是类本身(已经是可调用的),而是该类的实例。

为此,我们声明一个方法 __call__

from fastapi import Depends, FastAPI

app = FastAPI()


class FixedContentQueryChecker:
    def __init__(self, fixed_content: str):
        self.fixed_content = fixed_content

    def __call__(self, q: str = ""):
        if q:
            return self.fixed_content in q
        return False


checker = FixedContentQueryChecker("bar")


@app.get("/query-checker/")
async def read_query_check(fixed_content_included: bool = Depends(checker)):
    return {"fixed_content_in_query": fixed_content_included}

在这种情况下,这 __call__ 就是 FastAPI 将用于检查其他参数和子依赖项的方法,并且稍后将调用该方法将值传递给 路径操作函数中 的参数 。

参数化实例

现在,我们可以 __init__ 用来声明实例的参数,可以用来“参数化”依赖项:

from fastapi import Depends, FastAPI

app = FastAPI()


class FixedContentQueryChecker:
    def __init__(self, fixed_content: str):
        self.fixed_content = fixed_content

    def __call__(self, q: str = ""):
        if q:
            return self.fixed_content in q
        return False


checker = FixedContentQueryChecker("bar")


@app.get("/query-checker/")
async def read_query_check(fixed_content_included: bool = Depends(checker)):
    return {"fixed_content_in_query": fixed_content_included}

在这种情况下, FastAPI 将永远不会涉及或关心 __init__ ,我们将直接在我们的代码中使用它。

创建一个实例

我们可以使用以下方法创建此类的实例:

from fastapi import Depends, FastAPI

app = FastAPI()


class FixedContentQueryChecker:
    def __init__(self, fixed_content: str):
        self.fixed_content = fixed_content

    def __call__(self, q: str = ""):
        if q:
            return self.fixed_content in q
        return False


checker = FixedContentQueryChecker("bar")


@app.get("/query-checker/")
async def read_query_check(fixed_content_included: bool = Depends(checker)):
    return {"fixed_content_in_query": fixed_content_included}

这样,我们就可以“参数化”我们的依赖关系,该依赖关系现在已经包含 "bar" 在其中作为属性 checker.fixed_content

使用实例作为依赖

然后,我们可以 checker Depends(checker) 而不是中 使用它 Depends(FixedContentQueryChecker) ,因为依赖项是实例 checker 而不是类本身。

当解决依赖关系时, FastAPI 将这样调用 checker

checker(q="somequery")

...并在我们的 路径操作函数 中将 返回的所有依赖项值 作为参数 传递 fixed_content_included

from fastapi import Depends, FastAPI

app = FastAPI()


class FixedContentQueryChecker:
    def __init__(self, fixed_content: str):
        self.fixed_content = fixed_content

    def __call__(self, q: str = ""):
        if q:
            return self.fixed_content in q
        return False


checker = FixedContentQueryChecker("bar")


@app.get("/query-checker/")
async def read_query_check(fixed_content_included: bool = Depends(checker)):
    return {"fixed_content_in_query": fixed_content_included}

小费

所有这些似乎都是人为的。 可能还不清楚如何有用。

这些示例特意简单,但说明了它们如何工作。

在有关安全性的章节中,有以相同方式实现的实用程序功能。

如果您理解了所有这些内容,那么您已经知道这些用于安全性的实用工具如何在下面工作。

文章来源互联网,如有侵权,请联系管理员删除。邮箱:417803890@qq.com / QQ:417803890

微配音

Python Free

邮箱:417803890@qq.com
QQ:417803890

皖ICP备19001818号-4
© 2019 copyright www.pythonf.cn - All rights reserved

微信扫一扫关注公众号:

联系方式

Python Free