Django(十、中间件)

文章目录

  • 一、中间件的介绍
      • 中间件有什么用
      • 中间件功能
      • 自定义中间
      • 中间件的顺序

一、中间件的介绍

中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能

中间件流程图
在这里插入图片描述

中间件有什么用

如果你想修改请求,例如被传送到view中的HttpRequest对象。 或者你想修改view返回的HttpResponse对象,这些都可以通过中间件来实现。

可能你还想在view执行之前做一些操作,这种情况就可以用 middleware来实现。

Django默认的中间件:(在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件,如下图)

MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',
]

这七个中间件程序会在请求来时自上而下依次的处理request请求,在响应走时自下而上依次处理response响应。

中间件功能

网站访问频率的校验 用户权限的校验等全局类型的功能需求

前期我们要访问post请求,中间件的第四个字符串妨碍了简单post请求,初期阶段我们将其注释掉了

MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware',# 'django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',
]

这七个字符串实际上对应的是中间件程序存储的路径
在这里插入图片描述
我们顺着路径的文件,点进去可知源码
在这里插入图片描述
由上述图可知

1.七个中间件都继承了MiddlewareMixin类
2.都几乎有process_request和process_response函数
3.都必须传入参数
process_request需要传入request参数;
process_response需要传入request和response两个参数,必须返回response。

自定义中间

如何自定义中间件
1.创建存储自定义中间件代码的py文件或者目录(如果中间件很多)
2.参考自带中间件的代码编写类并继承
3.在类中编写五个可以自定义的方法
4.一定在配置文件中注册中间件才可以生效
在这里插入图片描述
编写自定义的中间件(在mymiddlie中编写MyMiddleware001)
在这里插入图片描述
编写好中间件,一定要去settings里的Middleware中注册自定义的中间件
在这里插入图片描述

中间件的顺序

我们只是定义了process_reqtest和process_response函数,我们想看看执行的顺序的,我们可以做一个小测试

mymiddle.py(自定义的中间件)

from django.utils.deprecation import MiddlewareMixinclass MyMiddleware001(MiddlewareMixin):def process_request(self,request):print('from MyMiddleware001 process_request')def process_response(self,request,response):print('from MyMiddleware001 process_response')return responseclass MyMiddleware002(MiddlewareMixin):def process_request(self,request):print('from MyMiddleware002 process_request')def process_response(self,request,response):print('from MyMiddleware002 process_response')return response

当我们从网页向URL发送请求时,请求通过了网关接口到达了中间件,在中间件的执行过程是自上而下,从而经过路由层>>视图层>>>等,当响应是经过中间件的时候是自下而上的,返回给网关接口,再打包给浏览器,

在这里插入图片描述
打印结果
在这里插入图片描述
如果我们还想测试如果遇到HttpResponse对象,会怎么样?看下面的解释

django中间件两个基本方法
process_request
1.请求来的时候会从上往下依次经过每一个注册的中间件里面的该方法 如果没有则直接跳过
2.如果该方法自己返回了HttpResponse对象那么不再往后执行而是直接原路返回

如果请求遇到了process_request方法,该方法返回了HttpResponse对象,如下

class MyMiddleware001(MiddlewareMixin):def process_request(self,request):print('from MyMiddleware001 process_request')return HttpResponse('你没有权限执行下面的中间件')  # 遇到了HttpResponse对象def process_response(self,request,response):print('from MyMiddleware001 process_response')return response

他经过的行径如黄色箭头,请求通过网关到中间件自上而下到达了中间件MyMiddleware001,就会直接执行MyMiddleware001的process_response方法,直接原路返回,不会走下面的中间件MyMiddleware002。

在这里插入图片描述
process_response

1.响应走的时候会从下往上依次经过每一个注册了的中间件里面的该方法 如果没有则直接跳过
2.该方法有两个先request和response 形参response指代的就是后端想要返回给前端浏览器的数据 该方法必须返回该形参 也可以替换from django.utils.deprecation import MiddlewareMixin
from django.http import HttpResponse
class MyMiddleware001(MiddlewareMixin):def process_request(self,request):print('from MyMiddleware001 process_request')def process_response(self,request,response):print('from MyMiddleware001 process_response')# return responsereturn HttpResponse('中间1直接返回了,返回了response')

注意:
1.一个请求经过了中间件,如果在执行process_request方法的时候直接返回了HttpResponse对象那么会原路返回执行自定义中间件的process_response 不是执行所有。

​ 2.在flask中,是从最底层中间程序的响应函数开始执行的

django中间件三个了解得方法

1.process_view路由匹配成功之后执行视图函数/类之前自动触发(顺序同process_request)
2.process_exception视图函数/类执行报错自动触发(顺序同process_response)
3.process_template_response视图函数/类返回的HttpResponse对象含有render并且对应一个方法的时候自动触发(顺序同process_response)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/166048.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

U盘启动制作工具Rufus

U盘启动制作工具Rufus 下载U盘启动制作工具Rufus,进入Rufus官网:http://rufus.ie/en/,打开之后往后滑动,找到download即可点击下载。 需要插入U盘 首先需要插入U盘,如果U盘有重要文件一定要备份,然后右键…

mysql安装亲测有效

http://t.csdnimg.cn/UHuy4

Grails 启动

Grails系列 Grails项目启动 文章目录 Grails系列Grails一、项目创建二、可能的问题1.依赖下载2.项目导入到idea失败3.项目导入到idea后运行报错 Grails Grails是一款基于Groovy语言的Web应用程序框架,它使用了许多流行的开源技术,如Spring Framework、…

Go语言初始化已有环境,跟踪已有依赖环境

在Go语言中,go.mod文件是Go模块的管理文件,用于跟踪和管理项目的依赖关系。go.sum 文件是 Go 语言模块的另一个关键文件,它记录了项目依赖的确切版本以及相应的哈希值。如果你得到了一个包含go.mod和go.sum文件的Go代码,&#xff…

内衣洗衣机怎么选?性价比高的小型洗衣机推荐

在机器解放了双手的时代中,洗衣机走进了千家万户,虽然在某种程度上缓解了人们手洗衣服的压力,但还是有不少人选择了人工手洗自己的内衣内裤,甚至连袜子都是手工洗的,这让人很是郁闷,倒不是说洗衣机不方便&a…

SpringBoot整合SpringSecurity+jwt+knife4生成api接口(从零开始简单易懂)

一、准备工作 ①&#xff1a;创建一个新项目 1.事先创建好一些包 ②&#xff1a;引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency>&…

可以远程控制电脑桌面的软件有哪些?

随着电脑办公的普及&#xff0c;人们对于远程控制电脑的需求也越来越大。远程控制电脑技术能够让用户在不同地点的电脑之间进行操作和访问&#xff0c;能够提高工作效率。可以远程控制电脑桌面的软件有哪些&#xff1f; 1. 远程监控电脑软件 需要安装在被控制端电脑&#xff…

【cppcheck 静态代码分析工具使用教程】

cppcheck 是一个流行的静态代码分析工具,用于 C 和 C++ 程序。它可以帮助检测代码中的错误、未定义的行为、内存泄漏等。在 Ubuntu 系统上使用 cppcheck 的基本步骤和示例如下: 安装 cppcheck 打开终端。使用以下命令安装 cppcheck:sudo apt-get update sudo apt-get insta…

linux -系统通用命令查询

有时候内网环境下&#xff0c;系统有些命令没有安装因此掌握一些通用的linux 命令也可以帮助我们解决一些问题查看 1.查看系统内核版本 uname -r2.查看系统版本 cat /etc/os-release3. 查看cpu 配置 lscpu4.查看内存信息 free [参数] 中各个数值的解释如下表 数值解释t…

4.并发中的各种锁概念

目录 概述锁分类按上锁方式划分按特性划分悲观锁/乐观锁重入锁/不可重入锁公平锁/非公平锁独享锁/共享锁 其它自旋锁分段锁无锁/偏向锁/轻量级锁/重量级锁 结束 概述 java 锁分类&#xff0c;虽是概念&#xff0c;很常见。 锁分类 按上锁方式划分 锁关键字解释隐式锁synchr…

提高工作效率的宝藏网站和宝藏工具(高级版)

一、参考资料 亲测&#xff1a;你这些网站都不知道&#xff0c;哪来时间去摸鱼&#xff1f; 提高工作效率的宝藏网站和宝藏工具&#xff08;基础版&#xff09; 二、好用的网站 HelloGitHub - 开源项目平台 HelloGitHub 是一个分享有趣、 入门级开源项目的平台。 希望大家能…

MySQL-02-InnoDB存储引擎

实际的业务系统开发中&#xff0c;使用MySQL数据库&#xff0c;我们使用最多的当然是支持事务并发的InnoDB存储引擎的这种表结构&#xff0c;下面我们介绍下InnoDB存储引擎相关的知识点。 1-Innodb体系架构 InnoDB存储引擎有多个内存块&#xff0c;可以认为这些内存块组成了一…

qgis添加arcgis的mapserver

左侧浏览器-ArcGIS地图服务器-右键-新建连接 Folder: / 展开-双击图层即可

oracle 表树形结构查询递归查询

简介&#xff1a; WITH RECURSIVE 是一种在关系型数据库中处理递归查询的语法。 举例&#xff1a; 假设我们有一个树形结构数据表 tree_table&#xff0c; 包含节点的 ID、父节点的 ID 和节点名称等字段。 示例表数据&#xff1a; --------------- | id | pid | name | ----…

物联网AI MicroPython学习之语法 I2S音频总线接口

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; I2S 介绍 模块功能: I2S音频总线驱动模块 接口说明 I2S - 构建I2S对象 函数原型&#xff1a;I2S(id, sck, ws, sd, mode, bits, format, rate, ibuf)参数说明&#xff1a; 参数类型必选参数&#xff1f…

关于接口测试自动化的总结与思考!

序 近期看到阿里云性能测试 PTS 接口测试开启免费公测&#xff0c;本着以和大家交流如何实现高效的接口测试为出发点&#xff0c;本文包含了我在接口测试领域的一些方法和心得&#xff0c;希望大家一起讨论和分享&#xff0c;内容包括但不仅限于&#xff1a; 服务端接口测试介…

Vatee万腾的科技冒险:vatee创新力量的前沿发现

在当今飞速发展的科技潮流中&#xff0c;Vatee万腾以其独特的创新力量成为前沿的引领者。这场科技冒险不仅仅是技术的迭代&#xff0c;更是一次前所未有的前沿发现之旅&#xff0c;让我们一同深入探索Vatee万腾的科技冒险&#xff0c;感受vatee创新力量的前沿奇迹。 Vatee万腾将…

【Thumbnailator】图片压缩、水印、格式修改一网打尽

前言&#xff1a; 对于javaweb服务端开发人员&#xff0c;图片资源的管理总是绕不开的一环。很多网站上都会提供上传图片这个功能&#xff0c;而现代数码设备拍摄出来的都是高清图片&#xff0c;分辨率很高&#xff0c;占用的空间也很大。物理存储的问题还算容易解决&#xff0…

机器学习---最大似然估计和贝叶斯参数估计

1. 估计 贝叶斯框架下的数据收集&#xff0c;在以下条件下我们可以设计一个可选择的分类器 : P(wi) (先验)&#xff1b;P(x | wi) (类条件密度) 但是。我们很少能够完整的得到这些信息! 从一个传统的样本中设计一个分类器&#xff1a; ①先验估计不成问题 ②对类条件密度…

苹果企业签名失败常见的问题

苹果企业签名失败的常见问题主要有以下几种&#xff1a; 证书过期或无效&#xff1a;苹果开发者需要定期更新他们的签名证书&#xff0c;以确保其有效性。一旦证书过期&#xff0c;相关应用将无法正常工作。证书不匹配&#xff1a;如果使用的证书与应用程序的Bundle ID不匹配&…