FastApi教程|依存关系第一步

发表时间:2020-03-09

FastAPI 有一个非常强大但直观的 依赖注入 系统。

它的设计使用起来非常简单,并且使任何开发人员都可以非常轻松地将其他组件与 FastAPI 集成 在一起

什么是“依赖注入”

“依赖注入” 在编程中表示,您的代码(在这种情况下,您的 路径操作函数 ) 有一种方法 可以声明它需要工作和使用的东西:“依赖”。

然后,该系统(在本例中为 FastAPI )将完成为代码提供所需依赖项(“注入”依赖项)所需的一切。

当您需要:

  • 有共享逻辑(一次又一次地使用相同的代码逻辑)。
  • 共享数据库连接。
  • 强制执行安全性,身份验证,角色要求等。
  • 还有很多其他事情

所有这些,同时最大程度地减少了代码重复。

第一步

让我们看一个非常简单的例子。 它将是如此简单,以至于目前它还不是很有用。

但是通过这种方式,我们可以专注于 依赖注入 系统的工作方式。

创建一个依赖,或“依赖”

让我们首先关注依赖关系。

它只是一个函数,可以采用 路径操作函数 可以采用的 所有相同参数 :

from fastapi import Depends, FastAPI

app = FastAPI()


async def common_parameters(q: str = None, skip: int = 0, limit: int = 100):
    return {"q": q, "skip": skip, "limit": limit}


@app.get("/items/")
async def read_items(commons: dict = Depends(common_parameters)):
    return commons


@app.get("/users/")
async def read_users(commons: dict = Depends(common_parameters)):
    return commons

而已。

2行

它具有与所有 路径操作功能 相同的形状和结构 。

您可以将其视为 没有“装饰器”(不带 ) 的 路径操作功能 @app.get("/some-path")

它可以返回您想要的任何东西。

在这种情况下,此依赖项期望:

  • 可选查询参数 q ,是 str
  • 可选查询参数 skip int ,默认为 0
  • 可选查询参数 limit int ,默认为 100

然后,它仅返回 dict 包含这些值的。

导入 Depends

from fastapi import Depends, FastAPI

app = FastAPI()


async def common_parameters(q: str = None, skip: int = 0, limit: int = 100):
    return {"q": q, "skip": skip, "limit": limit}


@app.get("/items/")
async def read_items(commons: dict = Depends(common_parameters)):
    return commons


@app.get("/users/")
async def read_users(commons: dict = Depends(common_parameters)):
    return commons

声明依赖,在“依赖”

你用同样的方法 Body Query 等你的 路径操作功能 参数,使用 Depends 一个新的参数:

from fastapi import Depends, FastAPI

app = FastAPI()


async def common_parameters(q: str = None, skip: int = 0, limit: int = 100):
    return {"q": q, "skip": skip, "limit": limit}


@app.get("/items/")
async def read_items(commons: dict = Depends(common_parameters)):
    return commons


@app.get("/users/")
async def read_users(commons: dict = Depends(common_parameters)):
    return commons

虽然你用 Depends 你的功能,你用同样的方法的参数 Body Query 等等, Depends 都有所不同。

您只提供 Depends 一个参数。

此参数必须类似于函数。

并且该函数采用与 路径操作函数 相同的方式获取参数 。

小费

在下一章中,您将看到除功能之外的其他“事物”还可以用作依赖项。

每当有新请求到达时, FastAPI 都会处理:

  • 用正确的参数调用您的依赖项(“ dependable”)函数。
  • 从函数中获取结果。
  • 将该结果分配给 路径操作函数中 的参数 。
common_parameters
/items/
/users/

这样,您 只需 编写一次共享代码, FastAPI 便会为 路径操作 调用它 。

校验

请注意,您不必创建特殊类并将其传递给 FastAPI 来“注册”它或类似的东西。

你只要把它传递给 Depends FastAPI 知道如何做休息。

async 还是不要 async

由于依赖项还将由 FastAPI调用 (与 路径操作函数 相同),因此在定义函数时将应用相同的规则。

您可以使用 async def 或normal def

而且,您可以 async def 在正常的 def 路径操作函数 内部 声明依赖关系 ,或者 def async def 路径操作函数 内部 声明依赖关系 ,等等。

没关系 FastAPI 将知道该怎么办。

注意

如果您不知道,请检查 异步: “急吗?” 有关部分 async await 在文档。

与OpenAPI集成

您的依存关系(和子依存关系)的所有请求声明,验证和要求都将集成在同一OpenAPI架构中。

因此,交互式文档也将从这些依赖项中获取所有信息:

简单的用法

如果您看一下它,则将 在 路径 操作 匹配 时声明使用 路径操作函数 ,然后 FastAPI 会使用正确的参数来调用该函数并使用响应。

实际上,所有(或大多数)Web框架都以相同的方式工作。

您永远不会直接调用这些函数。 它们由您的框架(在本例中为 FastAPI 调用

使用Dependency Injection系统,您还可以告诉 FastAPI 您的 路径操作函数 还“依赖”在您的 路径操作函数 之前应执行的其他 操作 FastAPI 将负责执行它并“注入”结果。

相同的“依赖注入”概念的其他通用术语是:

  • 资源
  • 提供者
  • 服务
  • 注射剂
  • 组件

FastAPI 插件

可以使用 依赖注入 系统 来构建集成和“插件” 。 但是实际上,实际上 并不需要创建“插件” ,因为通过使用依赖 ,可以声明无限数量的集成和交互,这些集成和交互可用于您的 路径操作函数

并且可以以非常简单直观的方式创建依赖项,从而使您可以导入所需的Python包,并将它们与您的API函数集成为几行代码, 从字面上看

在下一章中,您将看到有关关系和NoSQL数据库,安全性等的示例。

FastAPI 兼容性

依赖项注入系统的简单性使 FastAPI 兼容:

  • 所有关系数据库
  • NoSQL数据库
  • 外部包装
  • 外部API
  • 认证和授权系统
  • API使用情况监控系统
  • 响应数据注入系统
  • 等等

简单而强大

尽管分层依赖注入系统的定义和使用非常简单,但它仍然非常强大。

您可以定义依赖关系,而依赖关系又可以自己定义依赖关系。

最后,构建了层次结构的依赖关系树,并且 依赖关系注入 系统将为您解决所有这些依赖关系(及其子依赖关系)并在每个步骤中提供(注入)结果。

例如,假设您有4个API端点( path操作 ):

  • /items/public/
  • /items/private/
  • /users/{user_id}/activate
  • /items/pro/

那么您可以为每个依赖项和子依赖项添加不同的权限要求:

current_user
active_user
admin_user
paying_user
/items/public/
/items/private/
/users/{user_id}/activate
/items/pro/

OpenAPI 集成

所有这些依赖项在声明其要求的同时,还向 路径操作 添加参数,验证等 。

FastAPI 将负责将其全部添加到OpenAPI架构中,以便在交互式文档系统中显示它。

文章来源互联网,如有侵权,请联系管理员删除。邮箱: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