Django中间件探索:揭秘中间件在Web应用中的守护角色与实战应用

系列文章目录
- Django入门全攻略:从零搭建你的第一个Web项目
- Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作
- Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解
- Django ORM深度游:探索多对一、一对一与多对多数据关系的奥秘与实践
- 跨域问题与Django解决方案:深入解析跨域原理、请求处理与CSRF防护
- Django视图层探索:GET/POST请求处理、参数传递与响应方式详解
- Django路由与会话深度探索:静态、动态路由分发,以及Cookie与Session的奥秘
- Django API开发实战:前后端分离、Restful风格与DRF序列化器详解
- Django REST framework序列化器详解:普通序列化器与模型序列化器的选择与运用
- Django REST framework关联序列化器详解:掌握复杂关系的序列化与反序列化艺术
- Django REST framework中GenericAPIView与混入扩展类详解
- Django REST framework视图集与路由详解:深入理解ViewSet、ModelViewSet与路由映射器
- Django中间件探索:揭秘中间件在Web应用中的守护角色与实战应用
- 还在写0.0…
文章目录
- 系列文章目录
- 前言
- 一、默认中间件
- 1. 中间件作用
- 2. 中间件执行顺序
- 二、自定义中间件
- 1. 钩子方法的种类
- 2. 自定义中间件
- a. 自定义中间件并注册
- b. 提供一个测试中间件效果的正确视图
- c. 提供一个测试中间件效果的错误视图
- d. 提供一个测试中间件效果的模板视图
前言
Django中间件 是Web应用中的隐形守护者,负责在请求与响应之间执行关键任务。本文将解析Django默认中间件的作用,并教你如何编写和注册自定义中间件。通过实际案例,你将了解中间件在视图处理、错误处理和模板渲染中的作用。
一、默认中间件
1. 中间件作用
Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,全局修改Django的输入或输出。
中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。我们可以使用中间件,在Django处理视图的不同阶段对输入或输出进行干预。
因为改变的是全局,所以需要谨慎使用,用不好会影响到性能.
作用: 在不改 django框架源代码的基础上 新增全局的扩展功能
- 本质就是个装饰器 - - - 中间件只需要添加一次, 所有的接口都生效
2. 中间件执行顺序

- 如果你想修改请求,例如被传送到view中的**
HttpRequest对象。 或者你想修改view返回的HttpResponse**对象,这些都可以通过中间件来实现。- 可能你还想在view执行之前做一些操作,这种情况就可以用
middleware来实现。
Django默认的中间件:(在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件,如下图)


#settings.py
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware',# 为request/response提供了几种xss脚本过滤的安全改进,无它不安全'django.contrib.sessions.middleware.SessionMiddleware',# 开启session会话支持,无它无session'django.middleware.common.CommonMiddleware',# 基于APPEND_SLASH和PREPEND_WWW的设置来重写URL,# 如果APPEND_SLASH设为True,并且初始URL 没有以斜线结尾以及在URLconf 中没找到对应定义,这时形成一个斜线结尾的新URL;# 如果PREPEND_WWW设为True,前面缺少 www.的url将会被重定向到相同但是以一个www.开头的ur'django.middleware.csrf.CsrfViewMiddleware',# 添加跨站点请求伪造的保护,通过向POST表单添加一个隐藏的表单字段,并检查请求中是否有正确的值,无它无csrf保护'django.contrib.auth.middleware.AuthenticationMiddleware',# 在视图函数执行前向每个接收到的user对象添加HttpRequest属性,表示当前登录的用户,无它用不了request.user'django.contrib.messages.middleware.MessageMiddleware',# 开启基于Cookie和会话的消息支持,无它无message'django.middleware.clickjacking.XFrameOptionsMiddleware',# 对点击劫持的保护
]
二、自定义中间件
1. 钩子方法的种类
django中默认给咱们提供了几个中间件,如果在过程中开发者想自己对请求和响应做出特殊处理,需要自己定义一个中间件,自定义的中间件需要继承 django.utils.deprecation.MiddlewareMixin这个类。并重写对应的方法。
中间件中重写的5个方法:
1、process_request(self,request) 2、process_view(self, request, callback, callback_args, callback_kwargs) 3、process_template_response(self,request,response)4、process_exception(self, request, exception)5、process_response(self, request, response)
以上方法的返回值可以是
None或一个HttpResponse对象,如果是None,则继续按照django定义的规则向后继续执行,如果是HttpResponse对象,则直接将该对象返回给用户。
2. 自定义中间件
a. 自定义中间件并注册
自定义中间件 示例代码如下:
# customMiddleware.py
from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixinclass CustomMiddleware(MiddlewareMixin):def process_request(self, request):"""处理请求前: 在每个请求上,request对象产生之后,url匹配之前调用,返回None或HttpResponse对象"""print('before request=====', request)def process_view(self, request, view_func, *view_args, **view_kwargs):""":param view_func: Django即将使用的视图函数,它是实际的函数对象,而不是函数的名称作为字符串:param view_args: 将传递给视图的位置参数的列表:param view_kwargs: 将传递给视图的关键字参数的字典;view_args和view_kwargs都不包含第一个视图参数(request)"""# 处理视图前:在每个请求上,url匹配之后,视图函数调用之前调用,返回None或HttpResponse对象print('before view=======')def process_template_response(self, request, response):# 在视图函数执行完后立即执行的, 执行 该 函数有一个前提条件,那就是视图函数返回的对象是一个 TemplateResponse 对象或等价方法, 直接返回render函数无效)print("render template=======")return responsedef process_exception(self, request, exception):# 这个方法只有在视图函数中出现异常了才执行,它返回的值可以是一个None也可以是一个HttpResponse对象print("raise exception=======")return HttpResponse(exception)def process_response(self, request, response):# 处理响应后:视图函数调用之后,所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象print('after response=======', response)return response
在process_response中可以实现将返回数据修改操作 ,示例代码(此代码只可以响应drf的Response有效,因为普通HttpResponse中没有data属性):
from django.utils.encoding import force_str, force_bytes
import jsondef process_response(self, request, response):if response['Content-Type'] == 'application/json':# 解码JSON数据data = json.loads(force_str(response.content))# 修改数据data['modified_key'] = 'modified_value'# 重新编码JSON数据response.content = force_bytes(json.dumps(data))return response
注册中间件:
在 django 项目的 settings 模块中,在MIDDLEWARE_CLASSES变量中添加自定义中间件
MIDDLEWARE = [# 添加自定义的中间件---CustomMiddleware'app.customMiddleware.CustomMiddleware','corsheaders.middleware.CorsMiddleware','django.middleware.security.SecurityMiddleware',......
]
b. 提供一个测试中间件效果的正确视图
b.提供一个测试中间件效果的正确视图:
# views.py
from rest_framework.views import APIView
from django.http import HttpResponse# Create your views here.class IndexView(APIView):def get(self, request):print("IndexView======================")return HttpResponse("Hello Index GET")
当用户发起请求的时候会依次经过所有的的中间件,这个时候的请求会依次穿过所有中间件的
process_request方法,最后到达views的函数中,views函数处理后,在依次穿过所有中间件的process_response方法,最后返回给请求者。
中间件执行结果展示:
访问路径:http://localhost:8000/app/index/
before request===== <WSGIRequest: GET '/app/index/'>
before view=======
IndexView======================
after response======= <HttpResponse status_code=200, "text/html; charset=utf-8">
[16/Jun/2024 19:55:45] "GET /app/index/ HTTP/1.1" 200 15
c. 提供一个测试中间件效果的错误视图
c.提供一个测试中间件效果的错误视图:
# views.py
from rest_framework.views import APIView
from django.http import HttpResponse# Create your views here.class IndexView(APIView):def get(self, request):print("IndexView======================")3/0return HttpResponse("Hello Index GET")
此时,视图发生异常, 会执行中间件的
process_exception方法,而在该方法中,将异常信息作为响应返回,因此,页面显示"division by zero"
中间件执行结果展示:
访问路径:http://localhost:8000/app/index/
before request===== <WSGIRequest: GET '/app/index/'>
before view=======
IndexView======================
raise exception=======
after response======= <HttpResponse status_code=200, "text/html; charset=utf-8">
[16/Jun/2024 19:58:22] "GET /app/index/ HTTP/1.1" 200 16
d. 提供一个测试中间件效果的模板视图
d.提供一个测试中间件效果的模板视图:
# views.py
from django.template.response import TemplateResponse
from rest_framework.views import APIView# Create your views here.class IndexView(APIView):def get(self, request):print("IndexView======================")return TemplateResponse(request, 'index.html')
注意: 只有返回的对象是
TemplateResponse对象或等价方法时,才执行中间件的process_template_response方法,直接调用render方法无效。
中间件执行结果展示:
访问路径:http://localhost:8000/app/index/
before request===== <WSGIRequest: GET '/app/index/'>
before view=======
IndexView======================
render template=======
after response======= <TemplateResponse status_code=200, "text/html; charset=utf-8">
[16/Jun/2024 19:59:20] "GET /app/index/ HTTP/1.1" 200 182
TemplateResponseVSrender
TemplateResponse将模板的渲染延迟到视图完成之后。这允许任何模板响应中间件在响应上运行,并有可能在呈现模板之前更改模板或上下文数据。模板响应中间件运行后,将渲染模板,并在将响应返回给客户端之前对渲染的内容运行常规响应中间件。render立即呈现模板,并返回HttpResponse。

相关文章:
Django中间件探索:揭秘中间件在Web应用中的守护角色与实战应用
系列文章目录 Django入门全攻略:从零搭建你的第一个Web项目Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解Django ORM深度游ÿ…...
【PL理论】(24) C- 语言:有块的作用域 | 更新的语法 | 新的语义域 | 环境 vs. 内存
💭 写在前面:我们将再次扩展之前的C语言,让我们向这种语言引入“作用域”的概念。 目录 0x00 C- 语言:有块的作用域 0x01 C- 语言:更新的语法 0x02 新的语义域 0x03 环境 vs. 内存 0x00 C- 语言:有块的…...
React native 使用Animated 优化连续setState 性能问题
再部分场景下我们需要连续更新state刷新页面。一般情况刷新使用setstate没有问题,当需要连续刷新的情况会有明显的性能问题。 场景:自定义可拖动抽屉组件 新增需求在抽屉活动是更新主页面组件样式,此时需要动态传递抽屉高度修改主页组件属性…...
Qt中的事件循环
Gui框架一般都是基于事件驱动的,Qt也不例外,在 Qt 框架中,事件循环(Event Loop)是一个核心机制,负责管理和分发应用程序中的所有事件和消息。它确保了应用程序能够响应用户输入、定时器事件、窗口系统事件等…...
JVM常用概念之线程本地分配缓冲区(ThreadLocal Allocation Buffer,TLAB)
当实例化一个Java类时,运行时环境必须为相关实例分配存储空间,在JRE中此存储空间分配操作是由内存管理器实现的(其实是JVM的垃圾回收器),由于内存管理器通常使用与运行时目标语言不同的语言编写(例如&#…...
大模型生成的常见Top-k、Top-p、Temperature参数
参考: https://zhuanlan.zhihu.com/p/669661536 topK,topP https://www.douyin.com/video/7380126984573127945 主要是softmax产生的词表每个词的概率分布后, topK,比如K3,表示采样概率最大的前3个,其他全…...
ppt添加圆角矩形,并调整圆角弧度方法
一、背景 我们看的论文,许多好看的图都是用PPT做的,下面介绍用ppt添加圆角矩形,并调整圆角弧度方法。 二、ppt添加圆角矩形,并调整圆角弧度 添加矩形: 在顶部工具栏中,点击“插入”选项卡。 在“插图”…...
测评要求+基本措施+对应产品
基本要求项测评项基本措施对应产品 网络架构 网络架构 网络架构应保证网络各个部分的带宽满足业务高峰期需要;带宽管理流量控制系统 网络架构 网络架构 网络架构应避免将重要网络区域部署在边界处,重要网络区域与其他网络区域之间应采取可靠的技术隔离手…...
什么是git?
前言 Git 是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。是的,我对git的介绍就一条,想看简介的可以去百度一下😘😘😘 为什么要用git? OK,想象一下…...
C/C++中内存开辟与柔性数组
C/C中内存的开辟 在C中,我们都知道有三个区: 1. 栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结 束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指…...
编程App软件优化是什么
编程App软件优化是什么 在数字化时代,编程App软件已成为我们日常生活和工作中不可或缺的一部分。然而,随着技术的不断进步和用户需求的日益多样化,如何对编程App软件进行优化,以提供更高效、更流畅的用户体验,成为了开…...
爱了爱了,11款超良心App推荐!
AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/今天,我们向你推荐十款与众不同但又不错的win10软件,它们都有各自的功能和优点,相信你一定会喜欢。 1.图片处…...
Linux基础指令(二)(文件、权限等)
目录 普通文件的操作 touch cat 翻页 标准输出重定向: 标准输出重定向种类: 管道符:| 压缩指令: zip gzip tar Linux下最常见的打包指令 其他系统指令: 快捷…...
爆火的治愈系插画工具又来了,额度居然有18w,根本花不完?
AI治愈插画又又又来了 今天给大家推荐一款完全免费的软件,用过的人都说好! 先来看看我生成的图 制作过程非常简单,输入你想要生成的画面咒语。 工具地址:https://www.qiyuai.net/ 模型目前有两种 我上面的图就是用的第一种通用…...
Qt 实战(4)信号与槽 | 4.3、信号连接信号
文章目录 一、信号连接信号1、什么是信号连接信号?2、如何实现信号连接信号3、总结 前言: 在Qt框架中,信号与槽(Signals and Slots)机制是对象间通信的核心。通常情况下,我们习惯于将信号连接到槽函数上&am…...
Day 16:3040. 相同分数的最大操作数目II
Leetcode 相同分数的最大操作数目II 给你一个整数数组 nums ,如果 nums 至少 包含 2 个元素,你可以执行以下操作中的 任意 一个: 选择 nums 中最前面两个元素并且删除它们。选择 nums 中最后两个元素并且删除它们。选择 nums 中第一个和最后一…...
Go基础编程 - 07 - 字典(map)及其约束
字典(map) 下一篇:结构体1. 声明2. nil 值字典3. 判断某个键是否存在4. 遍历5. delete() 删除键值对6. 约束7. 扩展 上一篇:指针 下一篇:结构体 map 是一种无序的基于 key-value 的数据结构,Go 语言中的 …...
WebSocket 快速入门 与 应用
WebSocket 是一种在 Web 应用程序中实现实时、双向通信的技术。它允许客户端和服务器之间建立持久性的连接,以便可以在两者之间双向传输数据。 以下是 WebSocket 的一些关键特点和工作原理: 0.特点: 双向通信:WebSocket 允许服务…...
使用Spring Cloud设计电商系统架构
在当今互联网高速发展的时代,电子商务系统成为了商家与用户互动的主要方式之一。为了能够更好地应对高并发、可扩展性、灵活性等需求,微服务架构逐渐成为设计电商系统的首选方案。Spring Cloud作为一个成熟的微服务框架,为开发人员提供了一整…...
揭开 Docker 容器的神秘面纱:深入理解容器原理
前言 前几年比较火的是微服务,再然后就是云。讨论技术必谈微服务,要上云,开发出的产品也都是某某云。现在讨论比较少了,因为AI盖过他们。还有就是因为容器技术,现在几乎都是k8s,云原生。要比较快的上手k8s…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...


