我的编程空间,编程开发者的网络收藏夹
学习永远不晚

FastAPI--依赖注入之Depends(8)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

FastAPI--依赖注入之Depends(8)

看官网的描述Depends的使用,似乎比较懵懵懂懂的,于是乎还是需要花些时间再次学习一下关于依赖注入。

首先依赖注入它可以是函数也可以是类,如下面的函数形式的依赖注入:

 

简单的依赖说明

import uvicorn
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)):
    commons.update({'小钟': '同学'})
    return commons

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

if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)

 

梳理一下接口请求的流程:

  • 1: 上面的commons: dict = Depends(common_parameters)它声明了一个依赖关系: Depends(common_parameters): 这对接口的依赖进行了一个声明,表示的是接口参数请求依赖于common_parameters的函数。

    当接口被调用的时候,回调用common_parameters函数进行请求处理。

  • 2: common_parameters函数主要是负责接收函数,处理后返回一个字典,

  • 3:然后把Depends(common_parameters)返回的结果 传递给commons: dict,这个就是一个依赖注入的过程。

所以在上面的示例中common_parameters是我们被依赖对象

这个被依赖的对象,对接口请求的要求就是:

  • 可选查询参数q那是一个str.

  • 可选查询参数skip那是int,默认情况下是0.

  • 可选查询参数limit那是int,默认情况下是100.

  • 返回一个字典

请求示例:

http://127.0.0.1:8000/items/

 

1.png

 

 

这依赖注入的方式其实也挺方便,类似于接口装饰器的方式,比如common_parameters中我们可以先对相关的参数进行校验拦截,还可以再传递。 场景可以和我们之前的bottle的装饰器差不多类似:

  • 相同的逻辑判断处理

  • 用户身份鉴权

 

把类当作被依赖对象

上面我们的被依赖的对象是以函数的形式出现,那FastAPI它也支持以类的形式来表达。按官网说法被依赖对象它应该是必须一个可以调用的对象比如:类,函数之类的···

这里看一下以类的形式:

import uvicorn
from fastapi import Depends, FastAPI

app = FastAPI()

fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]

class CommonQueryParams:
    def __init__(self, q: str = None, skip: int = 0, limit: int = 100):
        self.q = q
        self.skip = skip
        self.limit = limit

@app.get("/items/")
async def read_items(commons: CommonQueryParams = Depends(CommonQueryParams)):
    response = {}
    # 如果q存在
    if commons.q:
        # 我们就把q加到一个新字典
        response.update({"q": commons.q})
        response.update({"小钟": '同学'})
    # 然后在我们的fake_items_db进行截取
    items = fake_items_db[commons.skip: commons.skip + commons.limit]
    response.update({"items": items})
    return response

if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)

上面我们的CommonQueryParams是一个类,它和我的函数其实差不多,当我们的接口被调用的时候,类对象就回被初始化, 按官网的说法: commons: CommonQueryParams = Depends(CommonQueryParams) 和 commons = Depends(CommonQueryParams) 是等价的。 还有一种是: commons: CommonQueryParams = Depends()

示例运行演示

有Q参数:

http://127.0.0.1:8000/items/?q=2323

 

1.png

 

 

没有Q参数:

http://127.0.0.1:8000/items/

 

1.png

多层嵌套依赖

多层嵌套的意思就是可以类可以类的意思。函数可以依赖函数。其实和我们的之前的参数校验一样。

比如下面的代码:

import uvicorn
from fastapi import Cookie, Depends, FastAPI

app = FastAPI()

def query_extractor(q: str = None):
    return q

def query_or_cookie_extractor(
        q: str = Depends(query_extractor), last_query: str = Cookie(None)
):
    if not q:
        return last_query
    return q

@app.get("/items/")
async def read_query(query_or_default: str = Depends(query_or_cookie_extractor)):
    return {"q_or_cookie": query_or_default}

if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)

其实意思就是query_or_cookie_extractor 依赖于query_extractor,然后query_or_cookie_extractor被注入到接口上也被依赖的对象。

官网的截图上面接口执行流程如下:

 1.png

对于同一个依赖,如果处理的结果是一样的,就是返回值是一样的话,我们可以进行多次调用依赖,这时候可以对被依赖的对象设置是否使用缓存机制:

async def needy_dependency(fresh_value: str = Depends(get_value, use_cache=False)):  return {"fresh_value": fresh_value}

请求一下页面

http://127.0.0.1:8000/items/

1.png

 

 由于没有cookie,返回空

 

list列表依赖

我们先看官方提供的示例代码:

import uvicorn
from fastapi import Depends, FastAPI, Header, HTTPException

app = FastAPI()

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

@app.get("/items/", dependencies=[Depends(verify_token), Depends(verify_key)])
async def read_items():
    return [{"item": "Foo"}, {"item": "Bar"}]

if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)

 

上述的代码意思是对我们的请求头部信息Header进行验证,因为示例是...三个点,说明是必选的字段:

分析上述的代码之后,运行一下试一试看看结果:

1:什么头部参数都不传递的情况提示,我们的头部参数异常

http://127.0.0.1:8000/items/

 

1.png

 

 

2:头部参数填写的情况:

注意点:参数提交的格式,因为是头部的参数,所以我们的代码上的x_token 会应该要写:x-token才对

1.png

 

 

错误的示例:

1.png

 

 所以上面列表的依赖的意思就是必须两天条件都成立才通过。这个感觉后期还是用到的比较多的哟!

 

多依赖对象注入和列表其实是一样的:

import uvicorn

from fastapi import Depends, FastAPI, Header, HTTPException
from fastapi import Depends, FastAPI

app = FastAPI()

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")
    return x_token


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

@app.get("/items/", dependencies=[Depends(verify_token), Depends(verify_key)])
async def read_items():
    return [{"item": "Foo"}, {"item": "Bar"}]

@app.get("/items2/")
async def items2(xt: str = Depends(verify_token), xk: str = Depends(verify_key)):
    return {"xt": xt, 'xk': xk}

if __name__ == '__main__':
    uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)

如上面的xt: str = Depends(verify_token),xk: str = Depends(verify_key),也是需要必须两个条件成立才可以。

正常情况:

x-token=fake-super-secret-token
x-key=fake-super-secret-key

 

1.png

 

 

非正常情况:

x-token=fake-super-secret-token
x-key=fake-super-secret-key--fei

 

1.png

 

 

 

本文参考链接:

http://www.zyiz.net/tech/detail-119883.html


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

FastAPI--依赖注入之Depends(8)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

FastAPI--依赖注入之Depends(8)

看官网的描述Depends的使用,似乎比较懵懵懂懂的,于是乎还是需要花些时间再次学习一下关于依赖注入。首先依赖注入它可以是函数也可以是类,如下面的函数形式的依赖注入:简单的依赖说明importuvicornfromfastapiimport
2023-01-31

swift依赖注入和依赖注入容器详解

这篇文章主要为大家介绍了swift依赖注入和依赖注入容器详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-01-28

.NET8 依赖注入

本文详细介绍了如何在.NET8中使用依赖注入(DI)提升应用程序的可维护性、可测试性和可扩展性。DI是一种设计模式,允许松散耦合地请求依赖项。.NET中的DI由Microsoft.Extensions.DependencyInjection命名空间提供。服务容器用于管理依赖项,并可以通过IServiceCollection接口进行配置。解析依赖项可通过构造函数注入或属性注入实现。最佳实践包括使用抽象、最短生命周期范围、构造函数注入和避免循环依赖。示例演示了如何使用DI配置和解析依赖项,并提供了使用自有Io
.NET8 依赖注入
2024-04-02

Vue3学习笔记之依赖注入Provide/Inject

provide和inject可以实现嵌套组件之间进行传递数据,这两个函数都是在setup函数中使用的,下面这篇文章主要给大家介绍了关于Vue3学习笔记之依赖注入Provide / Inject的相关资料,需要的朋友可以参考下
2023-05-19

ASP.NETCore使用AutoFac依赖注入

实现代码1、新建接口类:IRepository.cs,规范各个操作类的都有那些方法,方便管理。using System;using System.Collections.Generic;using System.Linq;using Sys
2023-06-03

详解asp.net core 依赖注入

前言好久没有写微博了,因为前段时间由于家庭原因决定从工作了3年多的北京转移到上海去。依赖注入在学习net core的时候也有写过类似的东西,只是实践的较少,结果来到上海新公司系统框架涉及到了这块知识点,所以在了解完自己的项目之后决定做一些相
2022-06-07

Spring学习之依赖注入的方法(三种)

spring框架为我们提供了三种注入方式,分别是set注入,构造方法注入,接口注入。今天就和大家一起来学习一下依赖注入的基本概念依赖注入(Dependecy Injection),也称为IoC(Invert of Control),是一种有
2023-05-31

python依赖注入怎么实现

在Python中实现依赖注入有多种方法,下面介绍两种常用的实现方式:1. 使用第三方库:可以使用流行的依赖注入框架,例如Dagger、Inject等。这些框架提供了注解和装饰器等方式来标记依赖项,并自动解析和注入依赖项。例如,使用Dagge
2023-08-30

golang依赖注入怎么实现

在Go语言中实现依赖注入可以使用两种常见的方式:构造函数注入和接口注入。1. 构造函数注入:构造函数注入是通过在结构体中定义一个包含所需依赖的构造函数来实现的。例如:```gotype Database struct {// ...}fun
2023-09-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录