当前位置: 首页 > news >正文

中间件-概念

什么是中间件?

中间件(Middleware)是位于 Web 服务器和应用程序之间的组件,它可以处理每个请求和响应。中间件的主要作用是在请求到达应用程序之前或响应返回客户端之前对其进行处理。中间件可以执行各种任务,如日志记录、身份验证、请求解析、响应压缩等。

中间件的作用

  1. 日志记录

    • 记录请求的时间、方法、路径等信息,便于调试和监控。
  2. 身份验证和授权

    • 检查请求是否包含有效的认证信息,确保只有授权用户可以访问特定资源。
  3. 请求解析

    • 解析请求体,提取所需的数据,以便应用程序处理。
  4. 响应处理

    • 修改响应头,添加缓存控制、内容编码等信息。
    • 压缩响应体,减少传输数据量。
  5. 错误处理

    • 捕获和处理应用程序中的异常,返回友好的错误信息。
  6. 性能监控

    • 记录请求的处理时间,监控应用程序的性能

示例代码中的中间件

在你的示例代码中,定义了两个中间件:TimeCalculateMiddlewareAuthMiddleware

1. TimeCalculateMiddleware
class TimeCalculateMiddleware(BaseHTTPMiddleware):async def dispatch(self, request: Request, call_next):print('TimeCalculateMiddleware-Start')start_time = time.time()response = await call_next(request)process_time = round(time.time() - start_time, 4)# 返回接口响应时间response.headers["X-Process-Time"] = f"{process_time} (s)"print('TimeCalculateMiddleware-End')return response

作用

  • 记录请求的处理时间。
  • 将处理时间添加到响应头中,方便客户端或监控系统查看。

具体实现

  • dispatch 方法是中间件的核心,它接收 request 和 call_next 两个参数。
  • start_time 记录请求开始的时间。
  • response = await call_next(request) 调用下一个中间件或最终的路由处理函数。
  • process_time 计算请求的处理时间。
  • 将处理时间添加到响应头中,使用 response.headers["X-Process-Time"]
  • 打印开始和结束的调试信息。
2. AuthMiddleware
class AuthMiddleware(BaseHTTPMiddleware):def __init__(self, app, header_value='auth'):super().__init__(app)self.header_value = header_valueasync def dispatch(self, request: Request, call_next):print('AuthMiddleware-Start')response = await call_next(request)response.headers['Custom'] = self.header_valueprint('AuthMiddleware-End')return response

作用

  • 添加自定义的响应头。
  • 在响应头中添加一个 Custom 头,值为 header_value

具体实现

  • __init__ 方法初始化中间件,接收 app 和 header_value 参数。
  • dispatch 方法接收 request 和 call_next 参数。
  • 调用 call_next(request) 处理请求。
  • 将 Custom 头添加到响应头中,使用 response.headers['Custom']
  • 打印开始和结束的调试信息。

注册中间件

app.add_middleware(TimeCalculateMiddleware)
app.add_middleware(AuthMiddleware, header_value='CustomAuth')

作用

  • 将中间件注册到 FastAPI 应用中。
  • app.add_middleware 方法用于添加中间件。
  • 第一个参数是中间件类,第二个参数是传递给中间件构造函数的参数。

路由处理

@app.get("/index")
async def index():print('index-Start')return {'code': 200}

作用

  • 定义一个简单的路由处理函数,处理 /index 路径的 GET 请求。
  • 返回一个 JSON 响应,包含 code 字段。

启动应用

if __name__ == "__main__":import uvicornimport osapp_model_name = os.path.basename(__file__).replace(".py", "")print(app_model_name)uvicorn.run(f"{app_model_name}:app", host='0.0.0.0', reload=True)

作用

  • 启动 FastAPI 应用。
  • 使用 uvicorn 作为 ASGI 服务器。
  • host='0.0.0.0' 表示应用监听所有网络接口。
  • reload=True 表示启用自动重载,方便开发调试。

总结

中间件在 Web 开发中是非常重要的组件,它们可以处理各种请求和响应的预处理和后处理任务。通过定义和注册中间件,可以实现日志记录、身份验证、性能监控等功能,从而提高应用的健壮性和可维护性。

相关文章:

中间件-概念

什么是中间件? 中间件(Middleware)是位于 Web 服务器和应用程序之间的组件,它可以处理每个请求和响应。中间件的主要作用是在请求到达应用程序之前或响应返回客户端之前对其进行处理。中间件可以执行各种任务,如日志记…...

vscode离线状态ssh连接不断输入密码登不上:配置commit_id

如题,vscode在一个离线服务器上,通过remote-ssh登录远程服务器,不断弹出密码框,总是进不去,后来了解到主要是不同vscode版本需要下载对应抑制commit-id的vscode-server-linux-x64.tar.gz包。 1)vscode, 点…...

Vim使用与进阶

1. Vim 技巧 撤销 U 反撤销 Ctrl U 历史命令 history 2.要在Vim中进行多行缩进&#xff0c;可以按以下步骤操作&#xff1a; 进入Vim编辑器并进入命令模式。使用 v 键或 Shift v 键选择多行需要缩进的文本。按下 > 键进行向右缩进&#xff0c;或按下 < 键进行向左…...

python中frida的安装+frida-server(雷电模拟器)保姆级安装教程

一.安装雷电模拟器 雷电模拟器官网 直接下载安装即可 &#xff08;1&#xff09;打开必要权限 雷电模拟器的设置已完毕 二.安装adb工具 本文以autox.js来实现adb操作 &#xff08;1&#xff09;vscode中下载auto.js插件 &#xff08;2&#xff09;雷电模拟器下载autox.j…...

Java线程安全集合之COW

概述 java.util.concurrent.CopyOnWriteArrayList写时复制顺序表&#xff0c;一种采用写时复制技术&#xff08;COW&#xff09;实现的线程安全的顺序表&#xff0c;可代替java.util.ArrayList用于并发环境中。写时复制&#xff0c;在写入时&#xff0c;会复制顺序表的新副本&…...

智能汽车制造:海康NVR管理平台/工具EasyNVR多品牌NVR管理工具/设备实现无插件视频监控直播方案

一、背景介绍 近年来&#xff0c;随着网络在我国的普及和深化发展&#xff0c;企业的信息化建设不断深入&#xff0c;各行各业都加快了信息网络平台的建设&#xff0c;大多数单位已经或者正在铺设企业内部的计算机局域网。与此同时&#xff0c;网络也成为先进的新兴应用提供了…...

[渗透]前端源码Chrome浏览器修改并运行

文章目录 简述本项目所使用的代码[Fir](https://so.csdn.net/so/search?qFir&spm1001.2101.3001.7020) Cloud 完整项目 原始页面修改源码本地运行前端源码修改页面布局修改请求接口 本项目请求方式 简述 好久之前&#xff0c;就已经看到&#xff0c;_无论什么样的加密&am…...

SAP揭秘者-怎么查看SAP 版本及S4 HANA的版本

文章摘要&#xff1a; 在给客户实施SAP项目或部署SAP服务器及SAP跟外部系统集成时&#xff0c;经常客户或第三方软件公司会问SAP版本或SAP HANA的版本。那么到底怎么来看这个SAP的版本呢&#xff1f;这个问题其实很多SAP模块顾问都不知道怎么看&#xff0c;你可以想象一下&…...

UE4 材质学习笔记13(格斯特纳波)

一.格斯特纳波 要让水面动起来&#xff0c;必须要保证平面有足够的三角面。我们可以在材质里的细节面板打开曲面细分&#xff0c;可以分裂三角面且使之数量更多&#xff0c;选择“扁平曲面细分&#xff0c;其作用是切割我的三角面&#xff0c;然后给我做一大堆三角面出来。 这…...

简述 C# 二维数据集合 List 的创建、遍历、修改、输出

简述 C# 二维数据集合 List 的创建、遍历、修改、输出 1、为什么要使用列表 List2、引入命名空间3、声明一维列表 List4、声明创建一个二维列表 List&#xff0c;数据类型 int5、 简单访问元素6、遍历二维列表&#xff0c;控制台输出7、遍历二维列表&#xff0c;修改数据&#…...

ps2024 一键安装教程 永久使用!

下载后&#xff0c;直接解压打开exe文件就能安装了 下载: https://pan.baidu.com/s/1uDSug00prwRw5igF0N-Xhw?pwd8888 【软件名称】:ps2024 【软件大小】:4.7g 【软件版本】:25.12.0.806 【软件简介】:Photoshop&#xff0c;简称“PS”&#xff0c;是由美国Adobe公司推出…...

ScrollView 真机微信小程序无法隐藏滚动条

问题描述 根据官方文档&#xff0c;使用:show-scrollbar"false"&#xff0c;隐藏滚动条无效 解决方法 添加一段样式在 scroll-view 上或者父级节点上下 ::-webkit-scrollbar {width: 0;height: 0;color: transparent;display: none;} eg. .inforDetails_app {p…...

【日志】编辑器开发——修复根据Excel表格数据生成Json文件和配置表代码报错

2024.10.15 又是蕉绿且摆烂的一天&#xff0c;不仅需要克制网瘾&#xff0c;还要努力学习&#xff0c;不然真的会被抛弃啊。但是我还是不想卷&#xff0c;给我的时间大概还有半年&#xff0c;突然好奇半年时间到底能学点什么或者做点什么。 【力扣刷题】 暂无 【数据结构】 …...

C#线性查找算法

前言 线性查找算法是一种简单的查找算法&#xff0c;用于在一个数组或列表中查找一个特定的元素。它从数组的第一个元素开始&#xff0c;逐个检查每个元素&#xff0c;直到找到所需的元素或搜索完整个数组。线性查找的时间复杂度为O(n)&#xff0c;其中n是数组中的元素数量。 …...

GPT+Python)近红外光谱数据分析与定性/定量建模技巧

2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年4月&#xff0c;更强版本的ChatGPT4.0上线&#xff0c;文本、语音、图像等多模态交互方式使其在…...

Spark动态资源释放机制 详解

Apache Spark 是一个分布式数据处理框架&#xff0c;其动态资源分配&#xff08;或称为动态资源释放&#xff09;机制&#xff0c;是为了更高效地利用集群资源&#xff0c;尤其是在执行具有不同工作负载的作业时。Spark 的动态资源释放机制允许它根据作业的需求自动分配和释放集…...

基于径向基神经网络(RBF)的构网型VSG自适应惯量控制MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介 逆变器虚拟同步发电机控制和核心控制参数就是虚拟惯量与虚拟阻尼&#xff0c;目前的文献中已有众多论文对VSG的虚拟参数展开了研究&#xff0c;但是百分之90都是采用构造函数的方法&#xff0c;使用…...

简单汇编教程9 字符串与字符串指令

目录 字符串的指令 movs 字符串传送 lods, stos使用 cmpsb的使用 SCASB的使用 字符串你很熟悉了&#xff0c;我们定义了无数次了&#xff01; %macro ANNOUNCE_STRING 2%1 db %2%1_LEN equ $ - %1 %endmacro 当然&#xff0c;我们现在来学习一个比较新的定义方式&#xf…...

Taro构建的H5页面路由切换返回上一页存在白屏页面过渡

目录 项目背景&#xff1a;Taro与Hybrid开发问题描述&#xff1a;白屏现象可能的原因包括&#xff1a; 解决方案解决后的效果图 其他优化方案可参考&#xff1a; 项目背景&#xff1a;Taro与Hybrid开发 项目使用Taro框架同时开发微信小程序和H5页面&#xff0c;其中H5页面被嵌…...

【学习笔记】网络设备(华为交换机)基础知识 9 —— 堆叠配置

提示&#xff1a;学习华为交换机堆叠配置&#xff0c;含堆叠的概念、功能、角色、ID和优先级&#xff1b;堆叠的建立过程以及注意事项&#xff1b;包含堆叠的配置命令&#xff0c;以及堆叠的配置案例 一、前期准备 1.已经可以正常访问交换机的命令行接口 Console口本地访问教…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...