一文掌握异步web框架FastAPI(三)-- 依赖注入(Depends)、中间件(日志记录、错误处理、身份验证、压缩响应、添加响应头)

 接:一文掌握异步web框架FastAPI(二)-CSDN博客

目录

 

六、依赖注入

1、基本用法

2、使用依赖注入传递配置参数

3、使用依赖注入进行权限验证

4、使用依赖注入管理资源

5、使用依赖注入进行依赖项缓存

6、使用依赖注入进行跨模块依赖管理

7、使用依赖注入进行请求上下文管理

 七、中间件

1、日志记录中间件

2、错误处理中间件

3、身份验证中间件(JWT认证)

4、压缩响应中间件

5、添加响应头中间件


六、依赖注入

FastAPI 提供了一个强大的依赖注入系统,使得管理和组织代码中的依赖关系变得更加简单和高效。依赖注入(Dependency Injection, DI)是一种设计模式,它允许将组件(如函数、类或服务)之间的依赖关系明确地表达出来,而不是硬编码在组件内部。这使得代码更加模块化、可测试和易于维护。

在 FastAPI 中,依赖注入主要通过 Depends 类实现。Depends 用于声明一个函数的依赖项,FastAPI 会自动处理这些依赖项的创建和传递。

  • 提高代码的可维护性:依赖关系明确,易于理解和修改。
  • 增强代码的可测试性:可以轻松地替换依赖项,进行单元测试。
  • 减少代码耦合:组件之间的耦合度降低,系统更加灵活。

1、基本用法

定义依赖项、使用依赖项以及在类中使用依赖项

from fastapi import FastAPI, Depends, HTTPException

app = FastAPI()


def get_db():
    db = "数据库连接"
    return db


def get_user(db: str = Depends(get_db)):
    # 依赖项的异常处理
    if db == "数据库连接":
        raise HTTPException(status_code=500, detail="数据库连接失败")
    user = {"name": "张三", "db": db}
    return user


class UserService:
    """类作为依赖项"""
    def __init__(self, user: dict = Depends(get_user)):
        self.user = user


# 多级依赖, FastAPI 会自动解析和注入这些依赖项。
@app.get("/users/")
async def read_users(user_service: UserService = Depends()):
    return user_service.user

2、使用依赖注入传递配置参数

使用依赖注入来传递配置参数,使得配置管理更加集中和灵活。

from fastapi import FastAPI, Depends

app = FastAPI()


# 设置类,用于存储数据库网址和密钥
class Settings:
    def __init__(self, db_url: str, secret_key: str):
        self.db_url = db_url
        self.secret_key = secret_key


# 获取设置的函数,返回包含数据库网址和密钥的 Settings 实例
def get_settings():
    return Settings(db_url="sqlite:///./test.db", secret_key="mysecret")


# 获取数据库连接的函数,依赖于 get_settings 函数
def get_db(settings: Settings = Depends(get_settings)):
    db = f"连接到数据库: {settings.db_url}"
    return db


# 异步读取数据库的路由,依赖于 get_db 函数
@app.get("/db/")
async def read_db(db: str = Depends(get_db)):
    return {"db": db}

3、使用依赖注入进行权限验证

用于实现权限验证,确保只有符合条件的用户才能访问特定资源。

from fastapi import FastAPI, Depends, HTTPException, status
from typing import Optional

app = FastAPI()


def get_current_user(token: str) -> Optional[str]:
    if token == "valid-token":
        return "张三"
    return None


def get_current_active_user(current_user: str = Depends(get_current_user)):
    if current_user is None:
        raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="未认证")
    return current_user


@app.get("/users/me")
async def read_users_me(current_user: str = Depends(get_current_active_user)):
    return {"user": current_user}

请求:

import requests

# 定义请求的URL
url = 'http://127.0.0.1:8000/users/me'
# 发送POST请求
response = requests.get(url, params={'token': 'valid-token'})
# 打印响应状态码和内容
print(f"Status Code: {response.status_code}")
print(f"Response Content: {response.text}")

4、使用依赖注入管理资源

用于管理资源,如数据库连接、文件句柄等,确保资源的正确创建和释放。

from fastapi import FastAPI, Depends, HTTPException
import sqlite3

app = FastAPI()


def get_db_connection():
    try:
        conn = sqlite3.connect("test.db")
        return conn
    except sqlite3.Error as e:
        raise HTTPException(status_code=500, detail=f"Database connection error: {e}")


@app.get("/items/")
async def read_items(conn: sqlite3.Connection =

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

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

相关文章

IDEA 安装热部署 JRebel -新版-亲测有效

由于采用直接从idea 下载的插件会出现版本不适配,激活不成功 下载地址:https://note.youdao.com/web/#/file/recent/note/WEB0e3010b4015162dc6a11d6c0ab11f750/ 导入刚才下载的插件 其中,Team URL可以使用在线GUID地址在线生成GUID 拿到GUID…

Node.js 模块化

1. 介绍 1.1 什么是模块化与模块 ? 将一个复杂的程序文件依据一定规则(规范)拆分成多个文件的过程称之为 模块化其中拆分出的 每个文件就是一个模块 ,模块的内部数据是私有的,不过模块可以暴露内部数据以便其他模块使用 1.2 什…

蓝桥杯注意事项

蓝桥杯注意事项 比赛注意事项 能暴力枚举就暴力枚举,能用简单的思路做就尽量用简单的思路做。认真审核题目的题意和输入输出的要求,避免因为误解题意而导致题目错误。对于提供多组测试样例或者需要对一个过程重复进行循环的代码,要时刻记住…

第四范式发布AI Data Foundry,加速大模型训练及应用

产品上新 Product Release 今日,第四范式发布AI Data Foundry,提供基于AI技术,融合人类专家反馈的高质量、丰富可扩展、多样化的数据集,大幅提升模型效果。同时,通过模型评估系统及工具,对模型效果进行有效…

w外链如何跳转微信小程序

要创建外链跳转微信小程序,主要有以下几种方法: 使用第三方工具生成跳转链接: 注册并登录第三方外链平台:例如 “W外链” 等工具。前往该平台的官方网站,使用手机号、邮箱等方式进行注册并登录账号。选择创建小程序外…

windows SVN 忘记账号密码

一、本地登录过且记录未清空 1、打开C:\Users\用户名\AppData\Roaming\Subversion\auth\svn.simple目录 2、下载SvnPwd.exe文件 链接地址:TortoiseSVN Password Decrypter 复制SvnPwd.exe到 C:\Users\用户名\AppData\Roaming\Subversion\auth\svn.simple目录下 3、运…

Web组态-仪器间的相互通信(WebSocket技术)

Web组态,通过Vue3TypeScriptWebSocket技术实现平台仪器间的相互通信,用于设计工业化虚拟仿真。 界面图如下(之前文章有详细教学) 如下是通信设备虚拟仿真的三个仪器,设计初衷是想三个仪器能够数据互通,实现…

【Thymeleaf】spring boot模板引擎thymeleaf用法详解

快速入门Thymeleaf 1️⃣ 什么是Thymeleaf?1️⃣ 模板入门2️⃣ 创建测试工程2️⃣ 配置文件2️⃣ 创建controller2️⃣ 写一个html页面2️⃣ 启动测试 1️⃣ Thymeleaf基础2️⃣ 实体类2️⃣ 增加接口2️⃣ $符号使用2️⃣ *符号的使用2️⃣ 符号的使用2️⃣ #符号…

一文掌握异步web框架FastAPI(五)-- 中间件(测试环境、访问速率限制、请求体解析、自定义认证、重试机制、请求频率统计、路径重写)

接上篇:一文掌握异步web框架FastAPI(四)-CSDN博客 目录 七、中间件 15、测试环境中间件 16、访问速率限制中间件,即限制每个IP特定时间内的请求数(基于内存,生产上要使用数据库) 1)限制单ip访问速率 2)增加限制单ip并发(跟上面的一样,也是限制每个IP特定时间内的请…

??? 命令行形式的简单功能的计算器的Shell脚本

文章目录 需求编码Way1Way2: 测试 需求 需求分析: 支持浮点型:使用let命令 编码 Way1 用下循环吧! #!/bin/bash # Author: # Date: # Description:# functions defines: input_check_to_startup() {num1$1num2$2isNum_statu…

Node版本管理nvm

公司项目比较多,且有历史包袱,没时间升级,高版本的node无法在低版本项目中打包编译; 下载地址 gitHub地址 nvm-setup.zip:安装版,推荐使用 nvm-setup.exe 常用指令 // 查看版本信息 nvm -v // 查看能安装…

《线下学习受局限,知识付费小程序开启新篇》

在知识大爆炸的时代,人们对知识的渴望从未如此强烈。然而,传统的线下学习方式却逐渐显露出诸多局限。 线下学习往往受到时间和空间的严格限制。为了参加一场培训课程或者讲座,你可能需要在特定的时间赶到特定的地点,这对于忙碌的…

大数据-188 Elasticsearch - ELK 家族 Logstash Output 插件

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

基于开源Jetlinks物联网平台协议包-MQTT自定义主题数据的编解码

目录 前言 1.下载官方协议包 2.解压 3.自定义主题 4.重写解码方法 5.以下是我解析后接收到的数据 前言 最近这段时间,一直在用开源的Jetlinks物联网平台在学习,偶尔有一次机会接触到物联网设备对接,在协议对接的时候,遇到了…

400行程序写一个实时操作系统(十):用面向对象思想构建抢占式内核

前言 通过前几章的学习,我们学会了如何为RTOS设计一个合理的内存管理算法。现在,是时候学习设计RTOS内核了。 关于RTOS内核的文章也有很多,但都有一点先射箭再化靶子的意味。要么是代码连篇解释却寥寥无几,要么是要先怎么样再怎么…

【星闪开发连载】WS63E模块连接华为IoT云

目录 引言 WS63E对MQTT的支持 程序修改 测试结果 结语 引言 在上一篇博文中已经介绍了WiFi的使用。今天介绍一下如何使用MQTT协议连接到华为云上。 WS63E对MQTT的支持 WS63E的代码参考直接提供了MQTT的支持,文档介绍见docs/board/WS63V100 MQTT 开发指南.pd…

【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【DSP指令加速篇】

【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【DSP指令加速篇】 一、前文回顾二、CMSIS-NN简介2.1 为什么介绍CMSIS-NN?2.2 CMSIS-NN是什么?2.3 CMSIS-NN核心特性2.4 CMSIS-NN算子支持 三、TFLMCMSIS-NN集成3.1 包含TFLM的STM32项目3.2 理解TFLM…

如何在Windows平台下基于Whisper来训练自己的数据

0. 简介 最近快到1024程序员节了,再给大家上点干活。Whisper是openai开源的一个语音转文字模型。也是现在识别效果最好的离线数据模型,但是我们发现我们在完成一些中英文或者专业术语对话的时候。这时候表现的效果就比较差了。而这一步就得用微调的方式…

EM算法(期望最大算法、Expectation Maximization Algorithm)

EM算法(期望最大算法、Expectation Maximization Algorithm) 引言 EM算法,全称为期望最大(Expectation Maximization)算法,是一种从不完全数据或有数据丢失的数据集(存在隐含变量)中求解概率模…

Oracle单实例静默安装

oracle 11g单实例静默安装 在CentOS上静默安装Oracle数据库 引言 在企业环境中,自动化和标准化是提高效率的关键。静默安装(也称为无人值守安装)是一种无需人工干预的安装方法,适用于大规模部署或需要重复安装的场景。本文将介…