Python框架篇(7):FastApi-依赖项

有时选择太多也会让人陷入焦虑,比如突然有一段自由时间,却因为想做的事情太多,最后把时间都浪费在了摇摆不定上,静不下心做最重要的事,或者说根本不知道最重要的事情是什么。---------- 《认知觉醒:开启自我改变的原动力》

1.介绍

在软件工程中,依赖注入dependency injection,缩写为 DI)是一种软件设计模式,也是实现控制反转的其中一种技术。这种模式能让一个对象接收它所依赖的其他对象。“依赖”是指接收方所需的对象。“注入”是指将“依赖”传递给接收方的过程。在“注入”之后,接收方才会调用该“依赖”[1]。此模式确保了任何想要使用给定服务的对象不需要知道如何建立这些服务。取而代之的是,连接收方对象(像是 client)也不知道它存在的外部代码(注入器)提供接收方所需的服务。 ----《维基百科》

通俗的理解: 依赖注入是一种软件设计模式,用于管理不同模块之间的依赖关系。在依赖注入中,一个对象不会直接创建或者获取它所依赖的对象,而是通过外部传递来实现。这种方式使得代码更加灵活、可维护、可测试。

2.与装饰器对比

之前学习过装饰器( Python学习(九):装饰器: https://mp.weixin.qq.com/s/QkKTfCS1rQ8z-QoKkX1JCQ),咋一看和依赖注入很像,下面从多个角度整理了他们之间的区别:

2.1 作用对象

  • 依赖注入:主要用于解耦组件之间的依赖关系,使得组件之间的耦合度降低,同时提高了代码的灵活性和可测试性。它通常用于将一个组件的依赖项(如对象、函数或其他组件)注入到另一个组件中。
  • 装饰器:主要用于增强函数的功能,例如在函数执行前后执行一些额外的逻辑、修改函数的行为或返回值等。装饰器可以为函数添加一些额外的功能,而不需要修改函数本身的定义。

2.2 实现方式

  • 依赖注入:通常通过参数传递或全局注册的方式实现,例如在 FastAPI 中使用 Depends 来注入依赖项。依赖注入使得组件的依赖关系更加明确,同时也更容易进行替换和测试。

  • 装饰器: 是通过在函数定义之前添加 @ 符号和装饰器函数来实现的。装饰器可以修改函数的行为、添加额外的功能或者改变函数的返回值,而不需要修改函数的原始定义。

2.3 使用场景

  • 依赖注入: 通常用于处理组件之间的依赖关系,并且使得代码更加模块化、可测试和可维护。它适用于需要将组件的依赖项解耦的场景,例如在 Web 框架中将数据库连接、配置等注入到路由处理函数中。
  • 装饰器: 通常用于增强函数的功能,例如添加日志、缓存、权限验证等功能。它适用于需要在函数执行前后添加一些额外逻辑的场景,而不需要修改函数本身的定义。

3.使用场景

FastAPI 框架中,依赖注入是一种核心功能,它提供了多种方式来处理和注入依赖项。以下是一些常见的依赖注入场景和示例:

3.1 参数注入

在之前的学习文章中Python框架篇(2):FastApi-参数接收和验证,我们主要关注的是参数是怎么接收,它的底层本质就是使用的依赖注入,才能把参数传递给函数。

from fastapi import FastAPI

app = FastAPI()

@app.post("/items/")
async def create_item(name: str, description: str):
    return {"name": name, "description": description}

3.2 路由组依赖

在之前的中间件学习中Python框架篇(5):FastApi-中间件使用: https://mp.weixin.qq.com/s/2MFPnly7pv_dhKT3zGw3VA,我们实现JWT的简单验证,这类实现是所有的接口都会进行JWT验证,有时我们只需要某些路由才进行校验,比如符合这种 /user/*才进行校验,使用依赖项可以很好的解决这类问题,使用示例如下:

a.定义依懒项

文件: app/depends/token_verify_depend.py

async def verifyToken(x_token: str = Header()):
    """ token验证 """
    print("x_token:", x_token)
    if x_token is None:
        raise HTTPException(status_code=401, detail="X-Token header missing")
    # 在这里进行验证 token 的逻辑,这里简单地假设 token 为 "valid_token"
    if x_token != "112334455":
        raise HTTPException(status_code=403, detail="Invalid token")
    return x_token
b.在路由中使用

文件: app/router/di_router.py

from fastapi import APIRouter, Depends
from app import depends

router = APIRouter(prefix="/di", tags=["依赖项学习"], dependencies=[Depends(depends.verifyToken)])

@router.get("/test")
async def test(user_id: int):
    """
    依懒项学习验证测试
    """

    return {"user_id": user_id}
c.验证
alt

3.3 全局依赖

除了上面可以针对某些路由加入依赖项,也可以在全局中加入依赖项,下面是官方文档示例:

from fastapi import Depends, FastAPI, Header, HTTPException

async def verify_token(x_token: str = Header()):
    if x_token != "fake-super-secret-token":
        raise HTTPException(status_code=400, detail="X-Token header invalid")


async def verify_key(x_key: str = Header()):
    if x_key != "fake-super-secret-key":
        raise HTTPException(status_code=400, detail="X-Key header invalid")
    return x_key

# 把依赖项添加至整个 FastAPI 应用
app = FastAPI(dependencies=[Depends(verify_token), Depends(verify_key)])


@app.get("/items/")
async def read_items():
    return [{"item""Portal Gun"}, {"item""Plumbus"}]

本文由 mdnice 多平台发布

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv9有效改进专栏汇总|未来更新卷积、主干、检测头注意力机制、特征融合方式等创新![2024/3/23]

​ 专栏介绍:YOLOv9改进系列 | 包含深度学习最新创新,助力高效涨点!!! 专栏介绍 YOLOv9作为最新的YOLO系列模型,对于做目标检测的同学是必不可少的。本专栏将针对2024年最新推出的YOLOv9检测模型&#xff0…

为何ChatGPT日耗电超50万度?

看新闻说,ChatGPT每天的耗电量是50万度,国内每个家庭日均的耗电量不到10度,ChatGPT耗电相当于国内5万个家庭用量。 网上流传,英伟达创始人黄仁勋说:“AI的尽头是光伏和储能”,大佬的眼光就是毒辣&#xff…

这班上的值不值

各位打工人,是不是每天上班遇到烦心事时,心里就想,这xx工作真是干不下去了。 后来在一个群里有朋友分享了一个excel,用来测算自己这个班上的值不值 就是这个 后来excel找不到了。 想了一下,这玩意做个小程序这不很简单…

【数字图像处理 】 灰度变换增强图像

文章目录 灰度变换增强图像对数变换指数(伽玛)变换直方图均衡化变换 灰度变换增强图像 对数变换 对数变换的作用是对图像的低灰度范围进行扩展,并对高灰度范围进行压缩,得到的结 果图像灰度分布更均匀,其通用表达式为: y c log…

为什么Python的内置方法中后面一定要带一个(),存在什么特殊用意吗?

在Python中,方法(或称为函数)后面的括号()有特定的含义,它们表示对方法的调用。这种语法规则不仅适用于Python,也适用于许多其他编程语言。以下是括号()的一些主要用途和含义: 1. 区分属性和方法 在Pytho…

JavaSE系统性总结全集(精华版)

目录 1. 面向对象(封装,继承,多态)详解 1.1 面向过程和面向对象的区别 1.2面向对象的三大特性 1.2.1 封装 1.2.2 继承 1.2.3 多态 1.2.4 方法重写和方法重载的区别(面试题) 1.2.5 访问权限修饰符分…

数据结构进阶篇 之 【二叉树】详细概念讲解(带你认识何为二叉树及其性质)

有朋自远方来,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,鞭数十,驱之别院 一、二叉树 1、二叉树的概念 1.1 二叉树中组分构成名词概念 1.2 二叉树的结构概念 1.3 特殊的二叉树 2、二叉树的存储结构 …

“架构(Architecture)” 一词的定义演变历史(依据国际标准)

深入理解“架构”的客观含义,不仅能使IT行业的系统架构设计师提升思想境界,对每一个积极的社会行动者而言,也具有长远的现实意义,因为,“架构”一词,不只限于IT系统,而是指各类系统(包括社会系统…

MySQL数据库中distinct的用法

distinct的用法 第一章、distinct的基本用法1.1)house表,表结构如图1.2)distinct过滤重复数据1.3)如果带上id字段1.4)distinct和聚合函数 第二章、distinct的位置2.1)放在第一位2.2)不在第一位的…

PTA-练习8

目录 实验5-3 使用函数求Fibonacci数 实验5-4 输出每个月的天数 实验5-9 使用函数求余弦函数的近似值 实验5-11 空心的数字金字塔 实验6-6 使用函数验证哥德巴赫猜想 实验6-7 使用函数输出一个整数的逆序数 实验6-8 使用函数输出指定范围内的完数 实验8-1-7 数组循环右…

练习4-权重衰减(李沐函数简要解析)

环境:练习1的环境 代码详解 0.导入库 import torch from torch import nn from d2l import torch as d2l1.初始化数据 这里初始化出train_iter test_iter 可以查一下之前的获取Fashion数据集后的数据格式与此对应 n_train, n_test, num_inputs, batch_size 20, 100, 200, …

【数据结构与算法】java有向带权图最短路径算法-Dijkstra算法(通俗易懂)

目录 一、什么是Dijkstra算法二、算法基本步骤三、java代码四、拓展(无向图的Dijkstra算法) 一、什么是Dijkstra算法 Dijkstra算法的核心思想是通过逐步逼近的方式,找出从起点到图中其他所有节点的最短路径。算法的基本步骤如下:…

无货源违规又现,现在还能做抖音小店吗?无货源商家该怎么调整?

大家好,我是电商花花。 最近好像又有很多人的店铺被查无货源违规,店铺还被扣12分,也申诉不了。 如果想要长期的做下去,就不要秀那些花里胡哨的操作,也不要为了短暂的自然流量而进行违规操作,为什么你的店…

【Java程序设计】【C00351】基于Springboot的疫情居家办公系统(有论文)

基于Springboot的疫情居家办公系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 项目获取 🍅文末点击卡片获取源码🍅 开发环境 运行环境:推荐jdk1.8; 开发工具:eclipse以及i…

后端常见面经之MySQL

MySQL字段类型 数值类型 整型经常被用到,比如 tinyint、int、bigint 。默认是有符号的,若只需存储无符号值,可增加 unsigned 属性。 int(M)中的 M 代表最大显示宽度,并不是说 int(1) 就不能存储数值10了,不管设定了显…

docker容器下部署hbase并在springboot中通过jdbc连接

我在windows的docker中部署了一个hbase服务,然后用springboot连接到此服务并访问数据。 详情可参考项目中的README.md。项目中提供了用于构建镜像的dockerfile,以及测试代码。 项目连接: https://gitee.com/forgot940629/hbase_phoenix_sprin…

java常用IO流功能——字符流和缓冲流概述

前言: 整理下学习笔记,打好基础,daydayup! 之前说了下了IO流的概念,并整理了字节流,有需要的可以看这篇 java常用应用程序编程接口(API)——IO流概述及字节流的使用 字符流 FileReader(文件字…

文件一键加水印的软件下载

文件一键加水印的软件通常具有强大的功能特点。 首先,它们支持多种文件格式,无论是常见的图片、文档,还是视频、音频文件,都能轻松应对。这极大地提高了软件的适用性和实用性。 其次,这些软件通常提供多种水印样式和…

【动态规划】【卡特兰数】Leetcode 96. 不同的二叉搜索树

【动态规划】【卡特兰数】Leetcode 96. 不同的二叉搜索树 动态规划卡特兰数 ---------------🎈🎈96. 不同的二叉搜索树 题目链接🎈🎈------------------- 动态规划 😒: 我的代码实现> 动规五部曲 ✒️确定dp数组…

一款不错的开源的 Linux 服务器运维管理面板:1Panel

适用于非运维人员的环境搭建、部署、监控等 一、1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。1Panel 的功能和优势包括: 快速建站:深度集成 Wordpress 和 Halo,域名绑定、SSL 证书配置等一键搞定; 高效管理&#xf…