中间件-概念
什么是中间件?
中间件(Middleware)是位于 Web 服务器和应用程序之间的组件,它可以处理每个请求和响应。中间件的主要作用是在请求到达应用程序之前或响应返回客户端之前对其进行处理。中间件可以执行各种任务,如日志记录、身份验证、请求解析、响应压缩等。
中间件的作用
-
日志记录:
- 记录请求的时间、方法、路径等信息,便于调试和监控。
-
身份验证和授权:
- 检查请求是否包含有效的认证信息,确保只有授权用户可以访问特定资源。
-
请求解析:
- 解析请求体,提取所需的数据,以便应用程序处理。
-
响应处理:
- 修改响应头,添加缓存控制、内容编码等信息。
- 压缩响应体,减少传输数据量。
-
错误处理:
- 捕获和处理应用程序中的异常,返回友好的错误信息。
-
性能监控:
- 记录请求的处理时间,监控应用程序的性能。
示例代码中的中间件
在你的示例代码中,定义了两个中间件:TimeCalculateMiddleware 和 AuthMiddleware。
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中进行多行缩进,可以按以下步骤操作: 进入Vim编辑器并进入命令模式。使用 v 键或 Shift v 键选择多行需要缩进的文本。按下 > 键进行向右缩进,或按下 < 键进行向左…...
python中frida的安装+frida-server(雷电模拟器)保姆级安装教程
一.安装雷电模拟器 雷电模拟器官网 直接下载安装即可 (1)打开必要权限 雷电模拟器的设置已完毕 二.安装adb工具 本文以autox.js来实现adb操作 (1)vscode中下载auto.js插件 (2)雷电模拟器下载autox.j…...
Java线程安全集合之COW
概述 java.util.concurrent.CopyOnWriteArrayList写时复制顺序表,一种采用写时复制技术(COW)实现的线程安全的顺序表,可代替java.util.ArrayList用于并发环境中。写时复制,在写入时,会复制顺序表的新副本&…...
智能汽车制造:海康NVR管理平台/工具EasyNVR多品牌NVR管理工具/设备实现无插件视频监控直播方案
一、背景介绍 近年来,随着网络在我国的普及和深化发展,企业的信息化建设不断深入,各行各业都加快了信息网络平台的建设,大多数单位已经或者正在铺设企业内部的计算机局域网。与此同时,网络也成为先进的新兴应用提供了…...
[渗透]前端源码Chrome浏览器修改并运行
文章目录 简述本项目所使用的代码[Fir](https://so.csdn.net/so/search?qFir&spm1001.2101.3001.7020) Cloud 完整项目 原始页面修改源码本地运行前端源码修改页面布局修改请求接口 本项目请求方式 简述 好久之前,就已经看到,_无论什么样的加密&am…...
SAP揭秘者-怎么查看SAP 版本及S4 HANA的版本
文章摘要: 在给客户实施SAP项目或部署SAP服务器及SAP跟外部系统集成时,经常客户或第三方软件公司会问SAP版本或SAP HANA的版本。那么到底怎么来看这个SAP的版本呢?这个问题其实很多SAP模块顾问都不知道怎么看,你可以想象一下&…...
UE4 材质学习笔记13(格斯特纳波)
一.格斯特纳波 要让水面动起来,必须要保证平面有足够的三角面。我们可以在材质里的细节面板打开曲面细分,可以分裂三角面且使之数量更多,选择“扁平曲面细分,其作用是切割我的三角面,然后给我做一大堆三角面出来。 这…...
简述 C# 二维数据集合 List 的创建、遍历、修改、输出
简述 C# 二维数据集合 List 的创建、遍历、修改、输出 1、为什么要使用列表 List2、引入命名空间3、声明一维列表 List4、声明创建一个二维列表 List,数据类型 int5、 简单访问元素6、遍历二维列表,控制台输出7、遍历二维列表,修改数据&#…...
ps2024 一键安装教程 永久使用!
下载后,直接解压打开exe文件就能安装了 下载: https://pan.baidu.com/s/1uDSug00prwRw5igF0N-Xhw?pwd8888 【软件名称】:ps2024 【软件大小】:4.7g 【软件版本】:25.12.0.806 【软件简介】:Photoshop,简称“PS”,是由美国Adobe公司推出…...
ScrollView 真机微信小程序无法隐藏滚动条
问题描述 根据官方文档,使用:show-scrollbar"false",隐藏滚动条无效 解决方法 添加一段样式在 scroll-view 上或者父级节点上下 ::-webkit-scrollbar {width: 0;height: 0;color: transparent;display: none;} eg. .inforDetails_app {p…...
【日志】编辑器开发——修复根据Excel表格数据生成Json文件和配置表代码报错
2024.10.15 又是蕉绿且摆烂的一天,不仅需要克制网瘾,还要努力学习,不然真的会被抛弃啊。但是我还是不想卷,给我的时间大概还有半年,突然好奇半年时间到底能学点什么或者做点什么。 【力扣刷题】 暂无 【数据结构】 …...
C#线性查找算法
前言 线性查找算法是一种简单的查找算法,用于在一个数组或列表中查找一个特定的元素。它从数组的第一个元素开始,逐个检查每个元素,直到找到所需的元素或搜索完整个数组。线性查找的时间复杂度为O(n),其中n是数组中的元素数量。 …...
GPT+Python)近红外光谱数据分析与定性/定量建模技巧
2022年11月30日,可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5,将人工智能的发展推向了一个新的高度。2023年4月,更强版本的ChatGPT4.0上线,文本、语音、图像等多模态交互方式使其在…...
Spark动态资源释放机制 详解
Apache Spark 是一个分布式数据处理框架,其动态资源分配(或称为动态资源释放)机制,是为了更高效地利用集群资源,尤其是在执行具有不同工作负载的作业时。Spark 的动态资源释放机制允许它根据作业的需求自动分配和释放集…...
基于径向基神经网络(RBF)的构网型VSG自适应惯量控制MATLAB仿真模型
微❤关注“电气仔推送”获得资料(专享优惠) 模型简介 逆变器虚拟同步发电机控制和核心控制参数就是虚拟惯量与虚拟阻尼,目前的文献中已有众多论文对VSG的虚拟参数展开了研究,但是百分之90都是采用构造函数的方法,使用…...
简单汇编教程9 字符串与字符串指令
目录 字符串的指令 movs 字符串传送 lods, stos使用 cmpsb的使用 SCASB的使用 字符串你很熟悉了,我们定义了无数次了! %macro ANNOUNCE_STRING 2%1 db %2%1_LEN equ $ - %1 %endmacro 当然,我们现在来学习一个比较新的定义方式…...
Taro构建的H5页面路由切换返回上一页存在白屏页面过渡
目录 项目背景:Taro与Hybrid开发问题描述:白屏现象可能的原因包括: 解决方案解决后的效果图 其他优化方案可参考: 项目背景:Taro与Hybrid开发 项目使用Taro框架同时开发微信小程序和H5页面,其中H5页面被嵌…...
【学习笔记】网络设备(华为交换机)基础知识 9 —— 堆叠配置
提示:学习华为交换机堆叠配置,含堆叠的概念、功能、角色、ID和优先级;堆叠的建立过程以及注意事项;包含堆叠的配置命令,以及堆叠的配置案例 一、前期准备 1.已经可以正常访问交换机的命令行接口 Console口本地访问教…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...
CppCon 2015 学习:Time Programming Fundamentals
Civil Time 公历时间 特点: 共 6 个字段: Year(年)Month(月)Day(日)Hour(小时)Minute(分钟)Second(秒) 表示…...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...
