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

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

TemplateResponse VS render

  • TemplateResponse将模板的渲染延迟到视图完成之后。这允许任何模板响应中间件在响应上运行,并有可能在呈现模板之前更改模板或上下文数据。模板响应中间件运行后,将渲染模板,并在将响应返回给客户端之前对渲染的内容运行常规响应中间件。
  • render立即呈现模板,并返回HttpResponse

在这里插入图片描述

相关文章:

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

系列文章目录 Django入门全攻略&#xff1a;从零搭建你的第一个Web项目Django ORM入门指南&#xff1a;从概念到实践&#xff0c;掌握模型创建、迁移与视图操作Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解Django ORM深度游&#xff…...

【PL理论】(24) C- 语言:有块的作用域 | 更新的语法 | 新的语义域 | 环境 vs. 内存

&#x1f4ad; 写在前面&#xff1a;我们将再次扩展之前的C语言&#xff0c;让我们向这种语言引入“作用域”的概念。 目录 0x00 C- 语言&#xff1a;有块的作用域 0x01 C- 语言&#xff1a;更新的语法 0x02 新的语义域 0x03 环境 vs. 内存 0x00 C- 语言&#xff1a;有块的…...

React native 使用Animated 优化连续setState 性能问题

再部分场景下我们需要连续更新state刷新页面。一般情况刷新使用setstate没有问题&#xff0c;当需要连续刷新的情况会有明显的性能问题。 场景&#xff1a;自定义可拖动抽屉组件 新增需求在抽屉活动是更新主页面组件样式&#xff0c;此时需要动态传递抽屉高度修改主页组件属性…...

Qt中的事件循环

Gui框架一般都是基于事件驱动的&#xff0c;Qt也不例外&#xff0c;在 Qt 框架中&#xff0c;事件循环&#xff08;Event Loop&#xff09;是一个核心机制&#xff0c;负责管理和分发应用程序中的所有事件和消息。它确保了应用程序能够响应用户输入、定时器事件、窗口系统事件等…...

JVM常用概念之线程本地分配缓冲区(ThreadLocal Allocation Buffer,TLAB)

当实例化一个Java类时&#xff0c;运行时环境必须为相关实例分配存储空间&#xff0c;在JRE中此存储空间分配操作是由内存管理器实现的&#xff08;其实是JVM的垃圾回收器&#xff09;&#xff0c;由于内存管理器通常使用与运行时目标语言不同的语言编写&#xff08;例如&#…...

大模型生成的常见Top-k、Top-p、Temperature参数

参考&#xff1a; https://zhuanlan.zhihu.com/p/669661536 topK&#xff0c;topP https://www.douyin.com/video/7380126984573127945 主要是softmax产生的词表每个词的概率分布后&#xff0c; topK&#xff0c;比如K3&#xff0c;表示采样概率最大的前3个&#xff0c;其他全…...

ppt添加圆角矩形,并调整圆角弧度方法

一、背景 我们看的论文&#xff0c;许多好看的图都是用PPT做的&#xff0c;下面介绍用ppt添加圆角矩形&#xff0c;并调整圆角弧度方法。 二、ppt添加圆角矩形&#xff0c;并调整圆角弧度 添加矩形&#xff1a; 在顶部工具栏中&#xff0c;点击“插入”选项卡。 在“插图”…...

测评要求+基本措施+对应产品

基本要求项测评项基本措施对应产品 网络架构 网络架构 网络架构应保证网络各个部分的带宽满足业务高峰期需要&#xff1b;带宽管理流量控制系统 网络架构 网络架构 网络架构应避免将重要网络区域部署在边界处&#xff0c;重要网络区域与其他网络区域之间应采取可靠的技术隔离手…...

什么是git?

前言 Git 是一款免费、开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。是的&#xff0c;我对git的介绍就一条&#xff0c;想看简介的可以去百度一下&#x1f618;&#x1f618;&#x1f618; 为什么要用git&#xff1f; OK&#xff0c;想象一下…...

C/C++中内存开辟与柔性数组

C/C中内存的开辟 在C中&#xff0c;我们都知道有三个区&#xff1a; 1. 栈区&#xff08;stack&#xff09;&#xff1a;在执行函数时&#xff0c;函数内局部变量的存储单元都可以在栈上创建&#xff0c;函数执行结 束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指…...

编程App软件优化是什么

编程App软件优化是什么 在数字化时代&#xff0c;编程App软件已成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;随着技术的不断进步和用户需求的日益多样化&#xff0c;如何对编程App软件进行优化&#xff0c;以提供更高效、更流畅的用户体验&#xff0c;成为了开…...

爱了爱了,11款超良心App推荐!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/今天&#xff0c;我们向你推荐十款与众不同但又不错的win10软件&#xff0c;它们都有各自的功能和优点&#xff0c;相信你一定会喜欢。 1.图片处…...

Linux基础指令(二)(文件、权限等)

目录 普通文件的操作 touch cat 翻页 标准输出重定向&#xff1a; 标准输出重定向种类&#xff1a;​​​​​​​ 管道符&#xff1a;&#xff5c; 压缩指令&#xff1a; zip gzip tar Linux下最常见的打包指令 其他系统指令&#xff1a;​​​​​​​ 快捷…...

爆火的治愈系插画工具又来了,额度居然有18w,根本花不完?

AI治愈插画又又又来了 今天给大家推荐一款完全免费的软件&#xff0c;用过的人都说好&#xff01; 先来看看我生成的图 制作过程非常简单&#xff0c;输入你想要生成的画面咒语。 工具地址&#xff1a;https://www.qiyuai.net/ 模型目前有两种 我上面的图就是用的第一种通用…...

Qt 实战(4)信号与槽 | 4.3、信号连接信号

文章目录 一、信号连接信号1、什么是信号连接信号&#xff1f;2、如何实现信号连接信号3、总结 前言&#xff1a; 在Qt框架中&#xff0c;信号与槽&#xff08;Signals and Slots&#xff09;机制是对象间通信的核心。通常情况下&#xff0c;我们习惯于将信号连接到槽函数上&am…...

Day 16:3040. 相同分数的最大操作数目II

Leetcode 相同分数的最大操作数目II 给你一个整数数组 nums &#xff0c;如果 nums 至少 包含 2 个元素&#xff0c;你可以执行以下操作中的 任意 一个&#xff1a; 选择 nums 中最前面两个元素并且删除它们。选择 nums 中最后两个元素并且删除它们。选择 nums 中第一个和最后一…...

Go基础编程 - 07 - 字典(map)及其约束

字典&#xff08;map&#xff09; 下一篇&#xff1a;结构体1. 声明2. nil 值字典3. 判断某个键是否存在4. 遍历5. delete() 删除键值对6. 约束7. 扩展 上一篇&#xff1a;指针 下一篇&#xff1a;结构体 map 是一种无序的基于 key-value 的数据结构&#xff0c;Go 语言中的 …...

WebSocket 快速入门 与 应用

WebSocket 是一种在 Web 应用程序中实现实时、双向通信的技术。它允许客户端和服务器之间建立持久性的连接&#xff0c;以便可以在两者之间双向传输数据。 以下是 WebSocket 的一些关键特点和工作原理&#xff1a; 0.特点&#xff1a; 双向通信&#xff1a;WebSocket 允许服务…...

使用Spring Cloud设计电商系统架构

在当今互联网高速发展的时代&#xff0c;电子商务系统成为了商家与用户互动的主要方式之一。为了能够更好地应对高并发、可扩展性、灵活性等需求&#xff0c;微服务架构逐渐成为设计电商系统的首选方案。Spring Cloud作为一个成熟的微服务框架&#xff0c;为开发人员提供了一整…...

揭开 Docker 容器的神秘面纱:深入理解容器原理

前言 前几年比较火的是微服务&#xff0c;再然后就是云。讨论技术必谈微服务&#xff0c;要上云&#xff0c;开发出的产品也都是某某云。现在讨论比较少了&#xff0c;因为AI盖过他们。还有就是因为容器技术&#xff0c;现在几乎都是k8s&#xff0c;云原生。要比较快的上手k8s…...

Elasticsearch:Open Crawler 发布技术预览版

作者&#xff1a;来自 Elastic Navarone Feekery 多年来&#xff0c;Elastic 已经经历了几次 Crawler 迭代。最初是 Swiftype 的 Site Search&#xff0c;后来发展成为 App Search Crawler&#xff0c;最近又发展成为 Elastic Crawler。这些 Crawler 功能丰富&#xff0c;允许以…...

C 语言连接MySQL 数据库

前提条件 本机安装MySQL 8 数据库 整体步骤 第一步&#xff1a;开启Windows 子系统安装Ubuntu 22.04.4&#xff0c;安装MySQL 数据库第三方库执行 如下命令&#xff1a; sudo aptitude install libmysqlclient-dev wz2012LAPTOP-8R0KHL88:/mnt/e/vsCode/cpro$ sudo aptit…...

【探索Linux】P.34(HTTPS协议)

阅读导航 引言一、HTTPS是什么1. 什么是"加密"2. 为什么要加密3. 常见的加密方式&#xff08;1&#xff09;对称加密&#xff08;2&#xff09;非对称加密 二、证书认证1. CA认证 三、HTTPS的加密底层原理✅非对称加密对称加密证书认证 温馨提示 引言 在上一篇文章中…...

Python 踩坑记 -- 调优

前言 继续解决问题 慢 一个服务运行有点慢&#xff0c;当然 Python 本身不快&#xff0c;如果再编码不当那这个可能就是量级上的劣化。 整个 Code 主线逻辑 1700&#xff0c;各依赖封装 3000&#xff0c;主线逻辑也是很久远的痕迹&#xff0c;长函数都很难看清楚一个 if els…...

英特尔澄清:Core i9处理器崩溃问题根本原因仍在调查,eTVB非主因

英特尔否认了有关已找到导致Core i9崩溃问题根本原因的报道&#xff0c;强调调查仍在继续。此前&#xff0c;德国媒体Igors Lab曾报道&#xff0c;英特尔已经发现了影响第13代猛禽湖&#xff08;Raptor Lake&#xff09;和第14代猛禽湖Refresh Core i9处理器稳定性的根源问题&a…...

python实战根据excel的文件名称这一列的内容,找到电脑D盘的下所对应的文件位置,要求用程序实现

今天客户需要 根据excel的文件名称这一列的内容&#xff0c;找到电脑D盘的下所对应的文件位置&#xff0c;要求用程序实现 数据样例&#xff1a;记录.xlsx 解决代码&#xff1a; 1、安装必要的库&#xff1a; pip install pandas openpyxl2、编写Python脚本&#xff1a; im…...

LVS ipvsadm命令的使用(二)

目录 上篇&#xff1a;负载均衡集群&#xff08;一&#xff09;-CSDN博客 命令参数概述 调度算法 基本命令 1. 添加虚拟服务器 2. 添加真实服务器 3. 删除虚拟服务器 4. 删除真实服务器 5. 列出当前配置 6. 修改服务器权重 7.保存规则 8. 清除所有配置 进行增加虚拟…...

Java面向对象-接口

Java面向对象-接口 一、JDK1.8之前二、接口的作用三、JDK1.8之后&#xff0c;新增非抽象方法四、静态方法 一、JDK1.8之前 1、类是类&#xff0c;接口是接口&#xff0c;它们是同一层次的概念 2、接口中没有构造器 3、接口如何声明&#xff1a;interface 4、在jdk1.8之前&…...

怎么不使用springboot Helper或Spring Initializr来创建spring项目

1. 创建项目目录结构 首先&#xff0c;创建项目的基本目录结构。一个典型的 Maven 项目结构如下&#xff1a; my-spring-project ├── src │ ├── main │ │ ├── java │ │ │ └── com │ │ │ └── example │ │ │ └…...

STM32CubeMX配置-RTC周期唤醒

一、简介 MCU为STM32G070&#xff0c;采用内部时钟32KHZ&#xff0c;配置为周期6s唤醒&#xff0c;调用回调函数&#xff0c;进行喂狗操作。 二、配置 初始时间、日期、周期唤醒时间配置。 开启周期唤醒中断 三、生成代码 调用回调函数&#xff0c;进行喂狗操作。 //RTC唤醒回…...

要维护公司的网站该怎么做/免费注册网址

2019独角兽企业重金招聘Python工程师标准>>> 今天决定看看开源中国安卓版app&#xff0c;并试着重构一下。好的进入主题。 创建MainActivity public class MainActivity extends ActionBarActivity implementsNavigationDrawerFragment.NavigationDrawerCallbacks,O…...

国外做游戏的视频网站有哪些/百度网站排名搜行者seo

前言 上一篇我们探讨了在静态语句中使用WHERE Column Param OR Param IS NULL的问题&#xff0c;有对OPTION(COMPILE)的评论&#xff0c;那这节我们来探讨OPTION(COMPILE)的问题。 探讨OPTION(COMPILE)问题 在SQL SERVER中任何时候第一次调用存储过程时&#xff0c;此时存储过…...

木屋网站建设/域名注册网站查询

Time Limit: 3 second Memory Limit: 2 MB 【问题描述】 “循环数”指那些不包括数字0的没有重复数字的整数(比如81362)&#xff0c;并且同时具有一个有趣的性质, 就像 这个例子: 如果你从最左边的数字开始 (在这个例子中是8) 数从左边这个数字到右边 (如果数到了最右边,回 到最…...

搭建网站 网页/营销策划方案模板范文

swift 常用高阶函数swift的高阶函数怎么使用&#xff1f;什么是高阶函数 文章出自我的博客&#xff1a;huhansome的博客 mapvar arr [1, 2, 3] //map函数是有返回值的&#xff0c;想要arr里面的值map过去需要arr重新接收新值 arr.map { (a : Int) -> Int inreturn a * 2 }…...

好的手机端网站模板下载软件/目前推广软件

1.Number.EPSILON是JS表示的最小精度 function add(a,b){if(Math.abs(a-b)<Number.EPSILON){return true;}else{return false} } console.log(add(0.10.2,0.3)) //true 2.Number.isFinite检测一个数值是否为有限数 3.Number.isNaN检测一个数值是否为NaN 4.Number.parse…...

如何做个人网站/搜狗网页

88.说一下你熟悉的设计模式&#xff1f; 1、单例模式&#xff1a; 保证一个类仅有一个实例&#xff0c;向整个系统提供这个实例 分为懒汉式和饿汉式 饿汉式是立即加载&#xff0c; 在类初始化的时候就主动创建实例 懒汉式是延迟加载&#xff0c;等到使用的时候才会去创建实例 2…...