Python Django 后端架构开发: 中间件架构设计
🌟 Python Django 后端架构开发: 中间件架构设计
🔹 中间件项目测试:自定义中间件的 process_response
与 process_view
方法
在 Django 中,中间件是一种用于处理请求和响应的钩子,可以在视图处理前后对请求和响应进行处理。通过自定义中间件,我们能够添加额外的逻辑,例如请求认证、响应修饰等。
首先,来看看如何使用自定义中间件的 process_response
和 process_view
方法。这两个方法分别用于在视图函数处理后修改响应以及在视图函数处理前对视图进行操作。
# middlewares.pyfrom django.utils.deprecation import MiddlewareMixinclass CustomMiddleware(MiddlewareMixin):def process_view(self, request, view_func, view_args, view_kwargs):# 在视图函数调用之前执行print(f"View Function: {view_func.__name__}, Args: {view_args}, Kwargs: {view_kwargs}")return Nonedef process_response(self, request, response):# 在视图函数调用之后,响应返回浏览器之前执行response['X-Custom-Header'] = 'Processed by CustomMiddleware'print("Response Status Code:", response.status_code)return response
代码解析:
-
process_view(self, request, view_func, view_args, view_kwargs)
:当 Django 确定视图函数并准备执行时,process_view
方法被调用。这个方法允许我们在视图处理之前插入一些逻辑,比如对请求进行进一步的验证或修改。这里,我们简单地输出了视图函数的名字和参数,这在调试时非常有用。 -
process_response(self, request, response)
:在视图函数执行完毕,并且生成响应后,process_response
方法被调用。我们可以使用这个方法来修改响应对象,例如添加自定义的 HTTP 头信息。这在实现安全相关的功能,如设置安全头或调整响应内容时,十分有用。
通过在项目中注册这个自定义中间件,我们可以在实际运行中看到它的效果:
# settings.pyMIDDLEWARE = [# 其他中间件'myproject.middlewares.CustomMiddleware', # 注册自定义中间件
]
当应用处理请求时,终端将输出视图函数信息,响应中还会包含一个自定义头 X-Custom-Header
,表明它已经通过我们的自定义中间件进行处理。这种方法适用于多种场景,如日志记录、请求认证、或者响应格式调整。
🔹 Django 默认中间件与自定义中间件中的 process_request
方法
process_request
方法是 Django 中间件的一个核心方法,它允许我们在 Django 视图处理请求之前对请求进行操作。Django 内置了多个默认中间件,例如 AuthenticationMiddleware
、SessionMiddleware
,它们都使用了 process_request
方法来实现诸如用户认证、会话管理等功能。
下面,我们创建一个自定义中间件,通过 process_request
方法记录请求的基本信息:
# middlewares.pyclass RequestLoggingMiddleware(MiddlewareMixin):def process_request(self, request):# 记录请求的基本信息print(f"Request Method: {request.method}, Request Path: {request.path}")return None # 返回 None 表示继续处理请求,返回 Response 则中断处理def process_response(self, request, response):# 在响应中附加处理时间response['X-Processing-Time'] = '100ms'return response
代码解析:
-
process_request(self, request)
:此方法在请求刚进入 Django 系统时调用,允许我们对请求进行预处理。在这个例子中,我们简单记录了请求的方法和路径。这个方法的强大之处在于,它允许我们在请求处理的早期阶段介入,比如验证用户权限、分析请求数据等。 -
process_response(self, request, response)
:虽然这个方法在前一节已经讨论过,但这里的用法是为了展示如何结合process_request
完成请求-响应的完整生命周期处理。在process_response
中,我们添加了一个自定义的头信息来表示处理时间,这在性能分析中非常有用。
通过这样的自定义中间件,我们可以轻松监控和记录每个请求的详情,从而在开发和调试阶段获得更多的信息支持。这种日志记录在大型应用的维护中尤其重要。
🔹 常见的自定义中间件功能及其总结
在实际开发中,自定义中间件有许多常见的应用场景。通过这些功能,我们能够轻松实现以下任务:
-
请求日志记录:记录每一个请求的详细信息,帮助我们监控流量和诊断问题。
class RequestLoggingMiddleware(MiddlewareMixin):def process_request(self, request):print(f"Received {request.method} request at {request.path}")return None
-
请求认证与授权:在
process_request
方法中检查用户是否有权访问特定资源,如果没有,则返回一个 403 错误响应。from django.http import HttpResponseForbiddenclass AuthenticationMiddleware(MiddlewareMixin):def process_request(self, request):if not request.user.is_authenticated:return HttpResponseForbidden("You are not allowed here.")return None
-
响应压缩:通过在
process_response
中间件方法中压缩响应数据来优化传输效率。import gzip from io import BytesIO from django.http import HttpResponseclass GzipResponseMiddleware(MiddlewareMixin):def process_response(self, request, response):if 'gzip' not in request.headers.get('Accept-Encoding', ''):return responsebuffer = BytesIO()with gzip.GzipFile(mode='wb', fileobj=buffer) as gzip_file:gzip_file.write(response.content)response.content = buffer.getvalue()response['Content-Encoding'] = 'gzip'return response
-
性能监控:结合
process_request
和process_response
,可以计算每个请求的处理时间,从而对系统性能进行监控。import timeclass PerformanceMonitoringMiddleware(MiddlewareMixin):def process_request(self, request):request.start_time = time.time()def process_response(self, request, response):duration = time.time() - request.start_timeprint(f"Request processed in {duration:.2f} seconds.")return response
总结:
中间件的强大功能为开发者提供了灵活性,能够在请求-响应的不同阶段定制处理逻辑。通过自定义中间件,我们可以轻松实现从用户认证到性能监控、响应压缩等多种功能,这在复杂的 Django 项目开发中尤为重要。
🔹 项目测试:自定义中间件中的 process_template_response
方法
process_template_response
是 Django 中间件中一个非常有用但常常被忽视的方法。它在视图返回 TemplateResponse
对象时被调用,允许我们在模板渲染之前对上下文数据进行修改。
下面的示例展示了如何使用 process_template_response
方法来动态修改模板上下文数据:
# middlewares.pyfrom django.template.response import TemplateResponseclass TemplateContextMiddleware(MiddlewareMixin):def process_template_response(self, request, response):# 确保响应是 TemplateResponse 类型if isinstance(response, TemplateResponse):# 在模板上下文中添加额外变量response.context_data['extra_data'] = 'Some extra data added by middleware'return response
代码解析:
process_template_response(self, request, response)
:该方法在视图生成TemplateResponse
后调用,这使得我们有机会在最终渲染之前对模板上下文进行修改。在这个例子中,我们添加了一个名为extra_data
的额外上下文变量,它可以在模板中被直接访问和显示。
这种方法在处理需要全局附加数据的场景中非常有用。例如,我们可以在每个页面中附加一个通用的用户通知信息或广告信息,而不需要在每个视图中重复相同的代码。
通过在项目中注册这个中间件,我们可以确保所有使用 TemplateResponse
的视图都会被自动添加额外的上下文数据,从而大大提高开发效率。
# settings.pyMIDDLEWARE = [# 其他中间件'myproject.middlewares.TemplateContextMiddleware', # 注册自定义中间件
]
业务场景:
假设一个电子商务网站需要在所有页面中显示用户的购物车数量,而不必在每个视图中手动传递这个变量。通过 process_template_response
方法,我们可以在每次渲染模板时自动附加这个数据。
# 假设在模板中使用的例子
# template.html<!DOCTYPE html>
<html>
<head><title>My E-commerce Site</title>
</head>
<body><h1>Welcome to My E-commerce Site</h1><p>Your Cart: {{ extra_data }}</p>
</body>
</html>
这种方法大大减少了在各个视图中传递相同上下文数据的繁琐工作,同时确保了模板的一致性和维护的便利性。
🔹 项目测试:自定义中间件中的 process_exception
方法
process_exception
是一个强大的中间件方法,它允许我们在视图函数发生异常时捕获和处理错误。通过这个方法,我们可以记录异常日志、显示自定义错误页面,或者在特定情况下处理错误而不让它们传播出去。
下面,我们将展示如何使用 process_exception
方法来捕获并处理视图中的异常:
# middlewares.pyimport loggingclass ExceptionHandlingMiddleware(MiddlewareMixin):def process_exception(self, request, exception):# 记录异常信息到日志文件logging.error(f"Exception occurred: {exception}, Path: {request.path}")# 可以在这里返回一个自定义的错误响应,阻止异常继续传播return None # 返回 None 表示让 Django 继续处理异常# 如果想返回一个自定义的响应,可以使用如下代码:# return HttpResponse("An error occurred. Please try again later.", status=500)
代码解析:
-
process_exception(self, request, exception)
:当视图函数中出现未捕获的异常时,Django 会调用这个方法。通过捕获异常,我们可以将错误记录到日志中,或者返回一个自定义的响应。例如,在生产环境中,我们可能希望隐藏错误细节,只显示一个通用的错误信息,以保护应用的安全性。 -
logging.error()
:通过使用 Python 的logging
模块,我们可以将异常信息记录到日志文件中,这对于问题的排查和调试非常有用。
这个方法在处理异常时为我们提供了极大的灵活性。我们可以选择捕获所有异常并记录它们,或者仅捕获特定类型的异常并进行特殊处理。
业务场景:
假设一个应用程序在生产环境中,我们希望在用户提交表单时捕获所有可能的异常,并显示一个通用的错误页面,而不是让用户看到可能暴露内部信息的技术性错误信息。
# 假设在 views.py 中使用的例子def my_view(request):try:# 这里是一些可能抛出异常的代码result = some_risky_operation()except Exception as e:# 在视图中手动捕获并处理异常return HttpResponse("An error occurred. Please contact support.", status=500)
通过结合视图中的异常处理和中间件的 process_exception
方法,我们可以确保无论何时发生异常,都能得到恰当的处理,从而提高系统的健壮性和用户体验。
相关文章:
Python Django 后端架构开发: 中间件架构设计
🌟 Python Django 后端架构开发: 中间件架构设计 🔹 中间件项目测试:自定义中间件的 process_response 与 process_view 方法 在 Django 中,中间件是一种用于处理请求和响应的钩子,可以在视图处理前后对请…...
HTTP的认证方式
0.HTTP认证相关的一些基本概念 0.1 HTTP保护空间(HTTP Protection Space) 也称为认证领域(Authentication Realm),是指在HTTP认证中用来定义一组受保护资源的范围。保护空间通常由一个realm标识符来表示,它定义了用户需要提供凭据(如用户名和密码)才能访问的资源集合…...

10分钟学会LVM逻辑卷
华子目录 前言认识LVMLVM基本概念LVM整体流程LVM管理命令pvs,vgs,lvs命令pvs基本用法选项示例 vgs基本用法选项示例 lvs基本用法 pvcreate,vgcreate,lvcreate命令pvcreate示例 vgcreate基本用法示例选项 lvcreate基本用法示例 pvr…...

【gitlab】gitlab-ce:17.3.0-ce.0 之2:配置
参考阿里云的教程docker的重启 sudo systemctl daemon-reload sudo systemctl restart docker配置 –publish 8443:443 --publish 8084:80 --publish 22:22 sudo docker ps -a 當容器狀態為healthy時,說明GitLab容器已經正常啟動。 root@k8s-master-pfsrv:~...

第七十四:前端实现点击页面某个菜单跳转到对应的锚点功能
1.用js来实现 scrollIntoView方法 先定义个id或者class随意,因为我是循环好几个小模块所以用动态的来实现 点击的时候传对应的类名进行滑动 document.getElementById(item.variableCode).scrollIntoView({behavior:“smooth”}); 加上behavior:“smooth” 进行平…...
PyTorch分布式训练全攻略:DistributedDataParallel精解与实战
标题:PyTorch分布式训练全攻略:DistributedDataParallel精解与实战 在深度学习飞速发展的今天,模型的规模和数据集的体量不断增长,单机单卡的训练方式已难以满足需求。分布式训练以其卓越的扩展性和效率,成为解决这一…...

Python(TensorFlow)多模光纤光束算法和GPU并行模拟
🎯要点 🎯多模光纤包含光学系统线性和非线性部分 | 🎯单变量线性回归、多变量线性回归、人脸图像年龄预测、音频语音分类和 X 射线图像评估算法 | 🎯在空间光调制器记录海螺参数矩阵,光束算法多变量预测年龄 | &#…...

实战Kubernetes之快速部署 K8s 集群 v1.28.0
文章目录 一、前言二、主机准备三、系统配置3.1. 关闭防火墙及相关配置3.2. 修改主机名3.3. 主机名DNS解析3.4. 时间同步3.5. 配置网络3.6. 重启服务器 四、安装软件4.1. 安装 Docker4.2. 安装 cri-dockerd4.3. 添加国内YUM源4.4. 安装 kubeadm、kubelet 和 kubectl 五、Master…...

YOLO知识点总结:
分类: 即是将图像结构化为某一类别的信息,用事先确定好的类别(category)或实例ID来描述图片。这一任务是最简单、最基础的图像理解任务,也是深度学习模型最先取得突破和实现大规模应用的任务。其中,ImageNet是最权威的评测集&…...

合宙LuatOS AIR700 IPV6 TCP 客户端向NodeRed发送数据
为了验证 AIR700 IPV6 ,特别新建向NodeRed Tcp发送的工程。 Air700发送TCP数据源码如下: --[[ IPv6客户端演示, 仅EC618系列支持, 例如Air780E/Air600E/Air780UG/Air700E ]]-- LuaTools需要PROJECT和VERSION这两个信息 PROJECT "IPV6_SendDate_N…...

git 如何生成sshkey公钥
打开git客户端 输入 ssh-keygen -t rsa -b 4096 -C "xxxxxxexample.com" 然后根据提示按enter 或者y 直到出现下图所示 打开 c盘的路径下的文件,/c/Users/18159/.ssh/id_rsa.pub 将id_rsa.pub中的公钥贴到git 网站上的SSH keys即可...

python从入门到精通:函数
目录 1、函数介绍 2、函数的定义 3、函数的传入参数 4、函数的返回值 5、函数说明文档 6、函数的嵌套调用 7、变量的作用域 1、函数介绍 函数是组织好的,可重复使用的,用来实现特定功能的代码段。 name "zhangsan"; length len(nam…...
【Android性能篇】如何分析 dumpsys meminfo 信息
一、dumpsys meminfo是什么 dumpsys meminfo 是一个用于分析Android设备内存使用情况的强大命令。 二、dumpsys meminfo的关键信息 要分析其输出信息,我们需要注意以下几个关键点: Total PSS by OOM adjustment:这个值表示每个进程的总比…...

c++进阶——继承的定义,复杂的菱形继承及菱形虚拟继承
目录 前言: 1.继承的概念及定义 1.1继承的概念 1.2 继承定义 1.2.2继承关系和访问限定符 1.2.3继承基类成员访问方式的变化 2.基类和派生类对象赋值转换 3.继承中的作用域 4.派生类的默认成员函数 5.继承与友元 6. 继承与静态成员 7.复杂的菱形继承及菱…...

计算机网络:DNS、子网掩码、网关
参考: https://blog.csdn.net/weixin_55255438/article/details/123074896 https://zhuanlan.zhihu.com/p/65226634 在计算机网络中,DNS(Domain Name System,域名系统)、子网掩码(Subnet Mask)…...

程序员如何学习开源项目
程序员如何学习开源项目 豆包MarsCode使用豆包MarsCode学习开源项目步骤导入git上开源的项目 豆包MarsCode https://www.marscode.cn/home 使用豆包MarsCode学习开源项目 步骤 https://www.marscode.cn/dashboard 导入git上开源的项目 找到项目的README.md文件,使…...

探索数据结构:红黑树的分析与实现
✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:数据结构与算法 贝蒂的主页:Betty’s blog 1. 红黑树的介绍 1.1. 红黑树的引入 我们前面学习了AVL树,…...
【设计模式】装饰器模式和适配模式
装饰器模式 装饰器模式能够很好的对已有功能进行拓展,这样不会更改原有的代码,对其他的业务产生影响,这方便我们在较少的改动下对软件功能进行拓展。 类似于 router 的前置守卫和后置守卫。 Function.prototype.before function (beforeFn)…...

Visual Studio VS 插件之 ReSharper
集成在VS2022上的ReSharper暂无找到汉化方式,如果有大神可以汉化,请指导下。 首先ReSharper 是IDE 下的插件 主要是基于C# 语句优化的这么一个插件。 使用ReSharper可以使开发效率大大提高,但是也是比较吃电脑的配置。所以说如果配置低的小…...

【二分查找】--- 进阶题目赏析
Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: 算法Journey 本篇博客我们继续来了解一些有关二分查找算法的进阶题目。 🏠 寻找峰值 📌 题目内容 162. 寻找峰值 - 力扣&#…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...

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() …...