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

news2024/11/15 8:55:22

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

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.coloradmin.cn/o/1546820.html

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

相关文章

【干货】无源滤波器设计讲解,工作原理+设计步骤

今天给大家分享的是:无源模拟滤波器针对很多入门小白不懂滤波器设计,一些老工程师上班很多年有的也不懂得总结知识点,以及想学习不知道怎么系统学习的这一类人群,前方知识点来袭,请君放心食用~ 在信号处理领域&#x…

AXI-Stream——草稿版

参考自哔站:FPGA IP之AXI4-Lite AXI4-Stream_哔哩哔哩_bilibili 信号 传输层级从小到大 TKEEP和TSTRB共同决定了是哪种数据流

红外循迹,避障模块介绍

本节将介绍标题中三种模块的应用以及工作原理 上图中,黑色的是红外接收管,绿色的是红外发射管,他俩与发光二级管都非常像,但功能上却有所不同。 发光二级管:亮度在一定的时间内随电流的增大而增大。 红外发射管&…

Python遥感开发之解决TIF数据之间行列不一致的问题

Python遥感开发之解决TIF数据之间行列不一致的问题 1.问题如图所示2.完整代码如下所示 前言:主要解决在同一分辨率的情况下,遥感数据之间行和列数据不一致的问题。 1.问题如图所示 我们发现这两个TIF的分辨率是一样的,都是0.01x0.01&#xff…

软考软件设计师2024年5月报名流程及注意事项

2024年5月软考软件设计师报名入口: 中国计算机技术职业资格网(http://www.ruankao.org.cn/) 2024年软考报名时间暂未公布,考试时间上半年为5月25日到28日,下半年考试时间为11月9日到12日。不想错过考试最新消息的考友…

Django(三)-搭建第一个应用(2)

一、编写更多视图 问题详情页——展示某个投票的问题和不带结果的选项列表。问题结果页——展示某个投票的结果。投票处理器——用于响应用户为某个问题的特定选项投票的操作。 # 1.问题详情页:展示某个投票的问题和不带结果的选项列表 def detail(request,questi…

第十二届蓝桥杯JavaB组省赛真题 - 时间显示

解题思路: 数量级较大,需要使用long类型 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan new Scanner(System.in);long num scan.nextLong();long allseconds num / 1000;long seconds allse…

CMake学习笔记(二)从PROJECT_BINARY_DIR看外部编译和内部编译

目录 外部编译 内部编译 总结 外部编译 看如下例子:我在EXE_OUT_PATH中建立了文件夹build、文件夹src2 和 文件CMakeLists.txt 其中EXE_OUT_PATH/CMakeLists.txt的内容如下: PROJECT(out_path) ADD_SUBDIRECTORY(src2 bin2) MESSAGE(STATUS "m…

Internet Explorer 降级

Internet Explorer 降级 1. version2. Internet Explorer 降级References 1. version 帮助 -> 关于Internet Explorer(A) 2. Internet Explorer 降级 开始 -> 控制面板 -> 卸载程序 -> 查看已安装的更新 搜索 Internet -> Internet Explorer 11 -> 卸载 -…

1978-2022年全国31省社会消费品零售总额数据

1978-2022年全国31省社会消费品零售总额数据 1、时间:1978-2022年 2、指标:社会消费品零售总额 3、范围:31省市 4、来源:整理自国家统计J和各省年鉴 5、缺失情况说明:1997-2022年31省市均无缺失, 199…

冒泡排序的习题全集(含答案)

习题1 1.给定一个包含红色,白色和蓝色,共n个元素的数组nums,原地对他们进行排序,使得相同颜色的元素相邻,并按照共色,白色,蓝色顺序排列。 我们使用整数0,1,2分别表示红…

2024生物科学、医学技术与化学国际会议(ICBSMTC2024)

2024生物科学、医学技术与化学国际会议(ICBSMTC2024) 会议简介 ICBSMTC2024是一个聚焦于生物科学、医学技术与化学领域的学术交流活动,会议将在中国桂林举行,会议旨在促进相关领域的学术交流与发展。会议将汇集来自世界各地的顶级学者和专家&#xff0c…

闪鱼随身WiFi好用吗?随身WiFi测评推荐!闪鱼的随身WiFi怎么样?

闪鱼随身WiFi因为爱和各大IP进行联动,被称为联名狂魔,广受年轻朋友们的喜爱。所以有非常多的朋友都在催小编出一期闪鱼随身WiFi的真实测评。现在,它来了!今天我们测试的这款闪鱼随身WiFi是闪鱼旗下BK0002这个热卖的型号。 一、外观…

day01-项目概述、环境搭建

1. 软件开发整体介绍 1.1 软件开发流程 1.2 角色分工 项目经理:对整个项目负责,任务分配、把控进度产品经理:进行需求调研,输出需求调研文档、产品原型等UI设计师:根据产品原型输出界面效果图架构师:项目整…

C#调用C++ (使用C++/CLI)

简介 C/CLI(C Common Language Infrastructure)是一种允许在 .NET 平台上创建托管代码(managed code)和非托管代码(unmanaged code)之间互操作的语言。其原理可以概括如下: 编译器支持: C/CLI 编…

msvcp140.dll是什么文件?msvcp140.dll丢失的多种解决方法详细解析

在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是“缺少xxx.dll文件”。而最近,有用户反映他们的电脑出现了“msvcp140.dll丢失”的问题。那么,msvcp140.dll是什么?为什么电脑会出现msvcp140.dll丢失问…

Rust编程(二)语法和数据类型

编程规范 类C语法,函数需要定义,指令需要以;结尾。需要大括号{} 文件名,变量,函数命名使用snake case,eg:new_function() 结构体,特征命名,使用大驼峰命名,e…

各城市宗族文化姓氏占比数据

各城市宗族文化姓氏占比数据 1、指标:省份代码、所属省份、城市代码、所属城市、第1大姓氏、第2大姓氏、第3大姓氏、宗族文化强度 2、方法说明: 根据2005年全国1%的人口调查数据计算。其中第1大姓氏第一大姓人口数/总人口数,宗族文化强度(…

脏牛提权(靶机复现)

目录 一、脏牛漏洞概述 二、漏洞复现 1.nmap信息收集 1.1.查看当前IP地址 1.2.扫描当前网段,找出目标机器 1.3.快速扫描目标机全端口 三、访问收集到的资产 192.168.40.134:80 192.168.40.134:1898 四、msf攻击 1.查找对应exp 2.选择对应exp并配置相关设…

关于dell SC4020/SCv2000中的BBU电池的一些常见问题汇总

近期销售了一些DELL SC4020/SCv2000的BBU(PN:0XJW8Y 或者 0C27CW)电池,有一些共性的问题,这里汇总下,供朋友们参考。还有没有覆盖到的问题,可以加VX: StorageExpert继续讨论。 1. 两个PN是否通用…