首页 > 其他分享 >FastAPI-6:依赖

FastAPI-6:依赖

时间:2024-06-09 09:16:01浏览次数:16  
标签:依赖 name dep FastAPI user 函数

6 依赖

FastAPI 非常出色的设计特性之一是 “依赖注入 ”的技术。这个术语听起来既专业又深奥,但它却是 FastAPI 的一个关键方面,而且在很多层面上都有惊人的作用。本章将介绍 FastAPI 的内置功能以及如何编写自己的功能。

6.1 什么是依赖

依赖项是某一时刻需要的特定信息。获取这些信息的通常方法是编写代码,在需要时获取这些信息。

在编写网络服务时,您可能需要执行以下操作:

  • 从HTTP请求中收集输入参数

  • 验证输入

  • 检查用户身份验证和授权

  • 从数据源(通常是数据库)中查找数据

  • 输出指标、日志或跟踪信息

  • 网络框架会将 HTTP 请求字节转换为数据结构,然后在网络层函数中提取所需的内容。

6.2 依赖关系的问题

在需要的时候得到想要的东西,而且不需要外部代码知道你是如何得到它的,这似乎非常合理。但事实证明,后果是存在的:

  • 测试

你无法测试可能以不同方式查找依赖关系的函数变体。

  • 隐藏依赖关系

隐藏细节意味着当外部代码发生变化时,您的函数所需的代码可能会被破坏。

  • 代码重复

如果您的依赖关系是常见的依赖关系(如在数据库中查找用户或合并HTTP请求中的值),您可能会在多个函数中重复查找代码。

  • OpenAPI 可见性

FastAPI 为您制作的自动测试页面需要依赖注入机制提供的信息。

6.3 依赖注入

依赖注入这个术语听起来很简单:将函数所需的任何特定信息传递到函数中。传统的方法是传递一个辅助函数,然后调用该函数来获取特定数据。

6.4 FastAPI依赖关系

FastAPI 更进一步:您可以将依赖项定义为函数的参数,FastAPI会自动调用这些依赖项,并传递它们返回的值。例如,user_dep依赖项可以从HTTP参数中获取用户的姓名和密码,然后在数据库中查找,并返回一个令牌,之后您就可以用它来跟踪该用户。网络处理函数不会直接调用这个函数,而是在函数调用时进行处理。

你已经看到了一些依赖关系,但没有看到它们被称为依赖关系: HTTP数据源,如Path、Query、Body 和Header。这些函数或Python类从HTTP请求的不同区域挖掘所请求的数据。它们隐藏了细节,如有效性检查和数据格式。

为什么不编写自己的函数来做到这一点呢?你可以这样做,但你不会有这些功能:

  • 数据有效性检查
  • 格式转换
  • 自动文档

在许多其他Web框架中,您可以在自己的函数中进行这些检查。但在 FastAPI 中,您可以处理自己的依赖关系,就像内置的依赖关系一样。

参考资料

6.5编写依赖关系

在FastAPI中,依赖关系是被执行的,因此依赖关系对象需要是Callable类型,包括函数和类--你调用的东西,带有括号和可选参数。

下例展示了一个user_dep()依赖关系函数,它接受姓名和密码字符串参数,如果用户有效,则返回True。在第一个版本中,让函数返回True。

实例:依赖函数

from fastapi import FastAPI, Depends, params

app = FastAPI()

# the dependency function:
def user_dep(name: str = params, password: str = params):
    return {"name": name, "valid": True}

# the path function / web endpoint:
@app.get("/user")
def get_user(user: dict = Depends(user_dep)) -> dict:
    return user

    
if __name__ == "__main__":
    import uvicorn
    uvicorn.run("hello:app", reload=True)

user_dep()是一个依赖函数。它的作用类似于FastAPI路径函数(它知道params等信息),但上面没有路径装饰器。它是辅助函数,而不是网络端点本身。

路径函数get_user()表示它需要user的参数变量,该变量将从依赖函数user_dep()中获取值。

注意:在 get_user()的参数中,我们不能说user = user_dep,因为user_dep是一个 Python 函数对象。我们也不能说user = user_dep(),因为这会在定义get_user()时调用 user_dep(),而不是在使用它时。因此,我们需要额外的辅助FastAPI Depends()函数,以便在需要时调用 user_dep()。

在路径函数参数列表中可以有多个依赖项。

6.5依赖范围

您可以将依赖关系定义为单个路径函数、一组路径函数或整个网络应用程序。

6.5.1单路径

在您的路径函数中,包含一个类似下面这样的参数:def pathfunc(name: depfunc = Depends(depfunc)):或直接这样:def pathfunc(name: depfunc = Depends()):

name是你想调用depfunc返回的值。在前面的例子中

  • pathfunc 是 get_user()。
  • depfunc 是 user_dep()。
  • name 是 user。

下例使用此路径和依赖关系返回一个固定的用户名和一个有效的布尔值。

from fastapi import FastAPI, Depends, params

app = FastAPI()

# the dependency function:
def user_dep(name: str = params, password: str = params):
    return {"name": name, "valid": True}

# the path function / web endpoint:
@app.get("/user")
def get_user(user: dict = Depends(user_dep)) -> dict:
    return user

    
if __name__ == "__main__":
    import uvicorn
    uvicorn.run("hello:app", reload=True)

如果您的依赖关系函数只是检查某些内容而不返回任何值,您也可以在路径装饰器中定义依赖关系(前一行,以 @ 开头):@app.method(url, dependencies=[Depends(depfunc)])

实例定义用户检查依赖项

from fastapi import FastAPI, Depends, params

app = FastAPI()

# the dependency function:
def user_dep(name: str = params, password: str = params):
    return {"name": name, "valid": True}

# the path function / web endpoint:
@app.get("/user")
def get_user(user: dict = Depends(user_dep)) -> dict:
    return user

    
if __name__ == "__main__":
    import uvicorn
    uvicorn.run("hello:app", reload=True)

6.5.2多路径

from fastapi import FastAPI, Depends, APIRouter

router = APIRouter(..., dependencies=[Depends(depfunc)])

这样,router下的所有路径函数都将调用 depfunc()。

6.5.3全局

在定义顶层 FastAPI 应用程序对象时,可以为其添加适用于所有路径函数的依赖关系。

from fastapi import FastAPI, Depends

def depfunc1():
    pass

def depfunc2():
    pass

app = FastAPI(dependencies=[Depends(depfunc1), Depends(depfunc2)])

@app.get("/main")
def get_main():
    pass

6.6 小结

本章讨论了依赖关系和依赖注入--在需要时以直接的方式获取所需数据的方法。

标签:依赖,name,dep,FastAPI,user,函数
From: https://www.cnblogs.com/testing-/p/18238752

相关文章

  • FastAPI-5:Pydantic、类型提示和模型预览
    5Pydantic、类型提示和模型FastAPI主要基于Pydantic。它使用模型(Python对象类)来定义数据结构。这些模型在FastAPI应用程序中被大量使用,是编写大型应用程序时的真正优势。5.1类型提示在许多计算机语言中,变量直接指向内存中的值。这就要求程序员声明它的类型,以便确定值的大小......
  • 另一个Java基于阻塞的定时消费内存队列(依赖guava)
    本文的代码是对一个Java基于阻塞的定时消费内存队列-Jackie_JK-博客园(cnblogs.com)方法的改进,完善了包装以及部分细节,非jdk21可能需要更换线程池类型。消费类型:@Getter@AllArgsConstructorpublicenumPushType{ELASTIC,SQL,;}队列参数枚举:@Getter@AllAr......
  • python系列:FASTAPI系列 01 环境准备 & FASTAPI系列 02-简单入门
    FASTAPI系列01环境准备&FASTAPI系列02-简单入门一、FASTAPI系列01环境准备前言一、FASTAPI简介二、环境准备1.快速安装fastapi以及相关依赖2.创建项目总结二、FASTAPI系列02-简单入门实现一个简单的例子一、FASTAPI系列01环境准备前言FastAPI是一......
  • IceRPC之依赖注入>快乐的RPC
    作者引言很高兴啊,我们来到了IceRPC之依赖注入>快乐的RPC,基础引导,打好基础,才能让自已不在迷茫,快乐的畅游世界。依赖注入和IceRPC了解IceRPC(C#)如何为依赖注入(DI)提供支持。DI作为可选功能DI的第一条规则是:不要引入对DI的依赖。IceRPC(C#)将此规则放首要位置上,即为......
  • Spring家族框架——Spring5——依赖注入(DI)
    ......
  • FastAPI-4:异步、并发和Starlette
    4异步、并发和Starlette本章关注FastAPI的底层Starlette库,尤其是它对异步处理的支持。在概述了Python中“同时做更多事情”的多种方法后,您将看到Python中较新的async和await关键字是如何融入Starlette和FastAPI的。4.1StarletteFastAPI的大部分网络代码都基于TomChristie......
  • python系列:FASTAPI系列 04-GET请求 params参数
    FASTAPI系列04-GET请求params参数FASTAPI系列04-GET请求params参数前言一、查询参数二、参数的默认值三、多路径查询参数四、查询参数为必填项总结FASTAPI系列04-GET请求params参数前言get请求的参数在url后面携带,通常称做queryparams一、查询参数在......
  • 安卓架构组件-依赖注入
    安卓依赖注入什么是依赖注入依赖注入(DI,DependencyInjection)是一种广泛的编程技术。把依赖(所需对象)传递给其它对象创建,好处是类的耦合更加松散,遵循依赖倒置的原则。类获取所需对象classEngine{funstart(){println("enginestart")}}class......
  • FastAPI-3:快速入门
    3快速入门第二章是python基础,故不做介绍。FastAPI是一个现代、快速(高性能)的网络框架,用于使用基于标准Python类型提示的Python3.6+构建API。FastAPI的创建者是SebastiánRamírez。FastAPI由SebastiánRamírez于2018年发布。与大多数PythonWeb框架相比,它在很多方面都更......
  • 2024ide构建maven项目是总是卡在解析Maven依赖项目 加速方案
    总是这样要加载好久好久才能完成构建我们可以添加阿里云镜像下载镜像是一个包含完整文件系统的容器运行环境的静态快照。它包含了运行某个应用程序所需的所有内容:代码、运行时、库、环境变量和配置文件等。镜像可以被用来创建容器实例,即容器是镜像的运行时实例。在容器化......