FastAPI-6:依赖

news/2024/10/16 2:25:58

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 中,您可以处理自己的依赖关系,就像内置的依赖关系一样。

参考资料

  • 软件测试精品书籍文档下载持续更新 https://github.com/china-testing/python-testing-examples 请点赞,谢谢!
  • 本文涉及的python测试开发库 谢谢点赞! https://github.com/china-testing/python_cn_resouce
  • python精品书籍下载 https://github.com/china-testing/python_cn_resouce/blob/main/python_good_books.md
  • Linux精品书籍下载 https://www.cnblogs.com/testing-/p/17438558.html

6.5编写依赖关系

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

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

实例:依赖函数

from fastapi import FastAPI, Depends, paramsapp = 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 userif __name__ == "__main__":import uvicornuvicorn.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, paramsapp = 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 userif __name__ == "__main__":import uvicornuvicorn.run("hello:app", reload=True)

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

实例定义用户检查依赖项

from fastapi import FastAPI, Depends, paramsapp = 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 userif __name__ == "__main__":import uvicornuvicorn.run("hello:app", reload=True)

6.5.2多路径

from fastapi import FastAPI, Depends, APIRouterrouter = APIRouter(..., dependencies=[Depends(depfunc)])

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

6.5.3全局

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

from fastapi import FastAPI, Dependsdef depfunc1():passdef depfunc2():passapp = FastAPI(dependencies=[Depends(depfunc1), Depends(depfunc2)])@app.get("/main")
def get_main():pass

6.6 小结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/41585.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

BlazorHybrid 通过Blazor简单调用本机功能

简单调用本机功能,例如打印,获取硬件信息,获取本机用户名,拦截JS功能,拦截错误信息等等.. 废话不多说先来截图使用 JsBridge JsBridge不科普了,同学们自行百度一下 BlazorWebView.cs using Microsoft.AspNetCore.Components.WebView; using Microsoft.AspNetCore.Components.We…

一文搞懂 ARM 64 系列: 一文搞懂 ARM 64 系列: 函数调用传参与返回值

一文搞懂 ARM 64 系列: 一文搞懂 ARM 64 系列: 函数调用传参与返回值函数调用涉及到传参与返回值,下面就来看下ARM 64中,参数与返回值的传递机制。 1 整数型参数传递 这里的整数型并不单指int类型,或者NSInteger类型,而是指任何能够使用整数表示的数据类型,包括char、BOOL…

4~6次题目集总结blog

一、前言 关于家具电路系统和答题判题系统我认为最主要的难点在于类设计,我们先需要设计好父类再对子类和具体方法进行补充,就拿电路系统举例,无论是受控设备还是控制设备,具体代码都较为简单,只需简单的数学运算就能求出具体功率,但要如何将设备加入电路当中以及能够进行…

oracle 基本查询

建表语句 序列 create sequence seq_jx increment by 1 start with 1 nomaxvalue nominvalue cache 10;字典类型表 create table sys_dict_type( id number(20) primary key, name varchar2(100) , type varchar2(100) , group_code varchar2(100) , status char(1) );comment…

VMware常用操作

VMware常用操作 VMware作为一款功能强大的虚拟化软件,为用户提供了一个灵活、高效的虚拟环境。在日常使用中,掌握VMware的常用操作对于提高工作效率、优化资源配置至关重要。以下将详细介绍VMware的一些常用操作及其背后的原理。 一、文件操作 在VMware中,文件操作是最基本的…

Kafka 基础知识

在数据事件流方面,Apache Kafka 是事实上的标准。它是一个由服务器和客户端组成的开源分布式系统。Apache Kafka 主要用于构建实时数据流管道。 Apache Kafka 被全球数以千计的领先组织用于高性能数据管道、流分析、数据集成和许多其他重要应用程序。 在本节中,我们将学习所有…

python-数据分析-NumPy的应用-1、基础

1、安装python 数据分析的三大神器 pip install numpy pandas matplotlibNumpPy 的说明 Numpy 是一个开源的 Python 科学计算库,用于快速处理任意维度的数组。Numpy 支持常见的数组和矩阵操作、 对于同样的数值计算任务,使用 NumPy 不仅代码要简洁的多,而且 NumPy 在性能上也…

安装VMware

安装VMware 官网下载 首先需要进行账号注册:https://support.broadcom.com/注册完成后,进行账号登录:https://login.broadcom.com/signin 此处登录的用户名为注册邮箱登录后按照下图点击选择VMware的版本勾选同意后,点击下载安装VMware 无脑安装即可安装包下载 如果不想注册…