Django框架之中间件
目录
一、引入
二、Django中间件介绍
【1】什么是Django中间件
【2】Django中间件的作用
【3】示例
三、Django请求生命周期流程图
四、Django中间件是Django的门户
五、Django中间件详解
六、中间件必须要掌握的两个方法
(1) process_request
(2) process_response
七、自定义中间件
【1】process_request
【2】process_response
【3】小结
一、引入
- Django自带七个中间件,每个中间件都有各自对应的功能
- 并且Django支持用户自定义中间件
- 在使用Django框架开发项目的时候,只要是涉及到全局相关的功能都可以使用中间件更加方便的完成
- 比如全局身份校验
- 全局用户权限校验
- 全局访问频率的校验
- ...
二、Django中间件介绍
【1】什么是Django中间件
- Django中间件是一个轻量级、可重用的组件,用于处理Django请求和响应的过程。
- 它提供了对请求和响应进行全局处理的机制,可以在请求达到视图之前进行预处理或在响应返回给客户端之前进行后处理。
- 中间件是按照顺序依次执行的,每个中间件都可以对请求和响应进行修改、补充或处理。
- 在Django的settings.py配置文件中,通过MIDDLEWARE设置来定义中间件的顺序。
【2】Django中间件的作用
- 认证和授权:
- 中间件可以在请求到达视图之前进行用户认证和权限验证,确保只有经过授权的用户才能访问敏感资源。
- 请求和响应处理:
- 中间件可以在请求到达视图之前对请求进行预处理
- 例如添加请求头信息、检查请求参数的合法性等操作。
- 同时,在视图函数返回响应给客户端之前,中间件还可以对响应进行后处理
- 例如添加额外的响应头、包装响应数据等操作。
- 中间件可以在请求到达视图之前对请求进行预处理
- 异常处理:
- 中间件还可以捕获视图函数中可能抛出的异常,并做相应的处理
- 例如记录异常日志、返回自定义错误信息等。
- 中间件还可以捕获视图函数中可能抛出的异常,并做相应的处理
- 性能优化:
- 通过中间件,可以对请求进行性能监测、缓存处理、压缩响应等操作,提升网站的整体性能。
【3】示例
class MyMiddleware:def __init__(self, get_response):self.get_response = get_responsedef __call__(self, request):# 在视图函数调用之前的预处理逻辑# ...response = self.get_response(request)# 在响应返回给客户端之前的后处理逻辑# ...return response
三、Django请求生命周期流程图
- 当客户端发送一个请求到Django应用程序时,Django会按照一定的生命周期流程处理该请求。
- 客户端发出HTTP请求。
- 请求被Web服务器接收并传递给Django应用程序。
- Django中的WSGI中间件开始处理请求,并可进行一些预处理操作。
- 中间件将请求传递给URL分发器(URL Dispatcher)。
- URL分发器根据URL模式将请求路由到相应的视图函数或处理器(View/Handler)。
- 视图函数或处理器执行相应的业务逻辑,可能会与数据库等外部资源交互。
- 视图函数或处理器返回一个HTTP响应对象。
- 响应对象经过中间件,可以在此进行后处理操作。
- 响应被发送给Web服务器。
- Web服务器将响应发送回客户端。

四、Django中间件是Django的门户
- 请求发来的时候需要先经过中间件才能到达真正的Django后端
- 响应返回的时候,最后也需要进过中间件返回发送出去
五、Django中间件详解
(1) SecurityMiddleware
- django.middleware.security.SecurityMiddleware:
- 安全中间件负责处理与网站安全相关的任务
- 例如设置HTTP头部,防止跨站脚本攻击(XSS),点击劫持等。
- 它可以通过配置自定义安全策略来确保网站的安全性。
(2) SessionMiddleware
- django.contrib.sessions.middleware.SessionMiddleware:
- 会话中间件负责处理用户会话的创建之间存储和检索用户数据。
- 它基于浏览器提供的Cookie或URL传递的会话ID进行会话跟踪,并将会话数据存储在后端数据库或缓存中,以实现用户状态的跨请求保持。
(3) CommonMiddleware
- django.middleware.common.CommonMiddleware:
- 通用中间件提供了一些常见而关键的HTTP请求处理功能
- 例如,根据请求的HTTP头信息设置语言、时区等。
- 此外,它还处理静态文件的serving,包括收集静态文件,为其生成URL,并在开发模式下提供静态文件的serving。
(4) CsrfViewMiddleware
- django.middleware.csrf.CsrfViewMiddleware:
- CSRF(Cross-Site Request Forgery)中间件用于防止跨站请求伪造攻击。
- 它在每个POST请求中验证一个CSRF标记,确保请求是通过合法的表单提交得到的,从而保护用户免受恶意站点的攻击。
(5) AuthenticationMiddleware
- django.contrib.auth.middleware.AuthenticationMiddleware:
- 认证中间件负责处理用户身份认证相关的任务
- 例如将认证信息关联到请求对象上,为每个请求提供一个user对象,以便在请求处理过程中轻松地获取和使用用户身份信息。
(6) MessageMiddleware
- django.contrib.messages.middleware.MessageMiddleware:
- 消息中间件用于在请求处理过程中存储和传递临时的、一次性的用户消息。
- 它允许在HTTP重定向之间跨请求传递消息,例如成功或错误提示,以改善用户体验。
(7) XFrameOptionsMiddleware
- django.middleware.clickjacking.XFrameOptionsMiddleware:
- 点击劫持中间件用于防止页面被嵌入到其他网站中,从而提供一定的点击劫持保护。
- 它通过设置X-Frame-Options HTTP头部来限制页面的显示方式,从而防止恶意网页通过iframe等方式嵌入当前网页。
六、中间件必须要掌握的两个方法
(1) process_request
(1)执行顺序
- 请求来的时候需要经过每一个中间件的 process_request 方法
- 结果的顺序是按照配置文件中注册的中间件从上往下的顺序执行的
(2)没有定义process_request
- 如果没有定义这个方法,就跳过这个中间件
(3)定义了返回值
- 如果在自定义中间件中定义了返回值(三板斧),那么请求将不再继续执行,而是直接原路返回(校验失败不允许访问)
(4)总结
- process_request 方法就是用来 做全局相关的所有限制功能
- 该方法在每个请求到达视图之前被调用,可以对请求进行预处理。
- 例如,进行身份验证、访问控制或请求日志记录等操作。
- 它接收一个HttpRequest对象作为参数,并且没有返回值
示例:
class AuthenticationMiddleware:def process_request(self, request):# 在这里进行身份验证操作if not request.user.is_authenticated:# 如果用户未经身份验证,则返回HttpResponse或重定向到登录页面
(2) process_response
- 响应被返回的时候需要结束每一个中间件里面的 process_response 方法
- 该方法有两个额外的参数
- request
- response
- 该方法必须返回 HttpResponse 对象
- 默认是response
- 支持自定义
- 顺序是按照配置文件中注册过的中间件从下往上依次经过
- 如果没有定义,则跳过,校验下一个
- 该方法在每个请求结束并且响应返回到客户端之前被调用。
- 可以在此处对响应进行处理
- 例如添加额外的头信息、修改响应内容等。
- 它接收一个HttpRequest对象和HttpResponse对象作为参数,并且必须返回一个HttpResponse对象。
示例:
class CustomResponseMiddleware:def process_response(self, request, response):# 在这里对响应进行处理response['X-Custom-Header'] = 'Custom Value'return response
七、自定义中间件
【1】process_request
- 路由层
from app01 import viewsurlpatterns = [path('admin/', admin.site.urls),path('index/',views.index),
]
- 视图层
def index(request):print("这是视图函数index")return HttpResponse("index 的返回值")
- 配置文件
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',# 注册自己的中间件(在应用下创建路径会有提示,但是如果在项目下创建就没有提示,需要自己根据路径书写)'app01.mymiddle.my_middle.MyMiddle',# 谁先注册就先执行谁'app01.mymiddle.my_middle.MyMiddle2',
]
- 自定义中间件
# 引入父类
from django.utils.deprecation import MiddlewareMixinclass MyMiddle(MiddlewareMixin):def process_request(self, request):print("这是第一个自定义中间件中的 process_request 方法")class MyMiddle2(MiddlewareMixin):def process_request(self, request):print("这是第二个自定义中间件中的 process_request 方法")
【2】process_response
# 引入父类
from django.utils.deprecation import MiddlewareMixinclass MyMiddle(MiddlewareMixin):def process_request(self, request):print("这是第一个自定义中间件中的 process_request 方法")def process_response(self, request, response):''':param request: :param response: 就是Django返回给浏览器的内容:return: '''print("这是第一个自定义中间件中的 process_response 方法")# 必须返回 responserreturn response
【3】小结
- 如果在第一个 process_request 方法就已经返回了 HttpResponse 对象,那么响应被返回的时候是经过所有的中间件里面的 process_response 方法还是会发生其他?
- 会直接走同级别的 process_response 方法 ,然后直接返回
- flask框架的中间件也有一个类似的方法
- 但是flask返回数据就必须经过所有中间件里面的 process_response 方法
相关文章:
Django框架之中间件
目录 一、引入 二、Django中间件介绍 【1】什么是Django中间件 【2】Django中间件的作用 【3】示例 三、Django请求生命周期流程图 四、Django中间件是Django的门户 五、Django中间件详解 六、中间件必须要掌握的两个方法 (1) process_request (2) process_respon…...
BTC 复兴:Ordinals 带来创新活力,BitVM 与 BitStream 相继问世
除了备受瞩目的 ETF,今年 Bitcoin 生态迎来全新的发展活力和机遇。Ordinals 协议的横空出世,以此为基础诞生的 BRC20 协议给整个比特币生态带去了一波新的能量,迎来铭文热度高涨。而诸如 BitVM、BitStream 等新技术甫一问世,便引发…...
STM32 CAN协议讲解以及代码
STM32 CAN 文章目录 STM32 CAN前言一、CAN外设1.主控制寄存器CAN_MCR2.位时序寄存器CAN_BTR3.CAN的发送邮箱4.CAN的接收FIFO5.验收筛选器 二、代码配置1.初始化2.发送数据3.接收数据4.main.c 前言 前面学习了CAN的一些理论知识,他在我们的STM32里面是怎么用的呢 前…...
京东数据分析(京东大数据):2023年10月京东手机行业品牌销售排行榜
鲸参谋监测的京东平台10月份手机市场销售数据已出炉! 根据鲸参谋平台的数据显示,今年10月份,京东平台手机行业的销量约340万,环比增长约11%,同比则下滑约2%;销售额为108亿,环比增长约17%&#x…...
计算机毕业设计 基于Hadoop的物品租赁系统的设计与实现 Java实战项目 附源码+文档+视频讲解
博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...
pop链反序列化 [MRCTF2020]Ezpop1
打开题目 网站源码为 Welcome to index.php <?php //flag is in flag.php //WTF IS THIS? //Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95 //And Crack It! class Modifier {protected …...
yolov5从英伟达平台移植到华为昇腾开发板上的思路
作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> 最近需要将yolov5代码从英伟达平台移植到华为昇腾开发板上。搜了一些代码和资料,大致明白了二者的差别。 1.二者使用的模型文件不一样 yolov…...
网络运维与网络安全 学习笔记2023.11.25
网络运维与网络安全 学习笔记 第二十六天 今日目标 ACL原理与类型、基本ACL配置、高级ACL配置 高级ACL之ICMP、高级ACL之telnet ACL原理与类型 项目背景 为了企业的业务安全,要求不同部门对服务器有不同的权限 PC1不能访问Server PC2允许访问Server 允许其他所…...
Trustzone/TEE/安全 面试100问
关键词:cache学习、mmu学习、cache资料、mmu资料、arm资料、armv8资料、armv9资料、 trustzone视频、tee视频、ATF视频、secureboot视频、安全启动视频、selinux视频,cache视频、mmu视频,armv8视频、armv9视频、FF-A视频、密码学视频、RME/CCA视频、学习资料下载、免费学习资…...
【数据结构】D : 图的顶点可达闭包
D : 图的顶点可达闭包 Description 给定有向图的邻接矩阵A,其元素定义为:若存在顶点i到顶点j的有向边则A[i,j]1,若没有有向边则A[i,j] 0。试求A的可达闭包矩阵A*,其元素定义为:若存在顶点i到顶点j的有向路径则A*[i,j…...
链表?细!详细知识点总结!
链表 定义:链表是一种递归的数据结构,它或者为空(null),或者是指向一个结点(node)的引用,该结点含有一个泛型的元素和一个指向另一条链表的引用。 其实链表就是有序的列表,它在内…...
【数据结构实验】排序(三)快速排序算法的改进(三者取中法)
文章目录 1. 引言2. 快速排序算法2.1 传统快速排序2.2 三者取中法 3. 实验内容3.1 实验题目(一)输入要求(二)输出要求 3.2 算法实现 4. 实验结果 1. 引言 快速排序是一种经典的排序算法,其核心思想是通过选择一个基准元…...
【数据结构/C++】栈和队列_顺序栈
#include<iostream> using namespace std; #define MaxSize 10 // 1. 顺序栈 typedef int ElemType; struct Stack {ElemType data[MaxSize];int top; } SqStack; // 初始化栈 void init(Stack &s) {// 初始化栈顶指针s.top -1; } // 入栈 bool push(Stack &s, …...
【数据结构实验】图(一)Warshall算法(求解有向图的可达矩阵)
文章目录 1. 引言2. Warshall算法原理2.0 图的基础知识a. 类型b. 表示 2.1 初始化可及矩阵2.2 迭代更新可及矩阵 3. 实验内容3.1 实验题目(一)输入要求(二)输出要求 3.2 算法实现 4. 实验结果 1. 引言 Warshall算法是一种用于求解…...
java协同过滤算法 springboot+vue游戏推荐系统
随着人们生活质量的不断提高以及个人电脑和网络的普及,人们的业余生活质量要求也在不断提高,选择一款好玩,精美,画面和音质,品质优良的休闲游戏已经成为一种流行的休闲方式。可以说在人们的日常生活中,除了…...
Android设计模式--适配器模式
至诚之道,可以前知 一,定义 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。 适配器模式在我们的开发中使用率极高,ListView,GridView&am…...
jQuery_06 基本过滤器的使用
什么是过滤器? 过滤器就是用来筛选dom对象的,过滤器是和选择器一起使用的。在选择了dom对象后在进行过滤筛选。 jQuery对象中存储的dom对象顺序与页面标签声明有关系。 声明顺序就是dom中存放的顺序 1.基本过滤器 使用dom对象在数组中的位置来作为过滤条…...
Kotlin学习——kt里面的函数,高阶函数 函数式编程 扩展函数和属性
Kotlin 是一门现代但已成熟的编程语言,旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作,并提供了多种方式在多个平台间复用代码,以实现高效编程。 https://play.kotlinlang.org/byExample/01_introduction/02_Functio…...
AI绘画“湿地公园的美女”
1、AI绘画:湿地公园的美女 通过输入描述:你需要什么场景的什么创作内容,AI根据内容创造出适合的主题 如图所示:请帮我创作一个湿地公园的像高圆圆的美女图片。 输出的结果如下:总体来说感觉还是非常快,基…...
延时任务定时发布,基于 Redis 与 DB 实现
目录 1、什么是延时任务,分别可以使用哪些技术实现? 1.2 使用 Redis 和 DB 相结合的思路图以及分析 2、实现添加任务、取消任务、拉取任务 3、实现未来数据的定时更新 4、将数据库中的任务数据,同步到 Redis 中 1、什么是延时任务ÿ…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...
Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...
Vue 3 + WebSocket 实战:公司通知实时推送功能详解
📢 Vue 3 WebSocket 实战:公司通知实时推送功能详解 📌 收藏 点赞 关注,项目中要用到推送功能时就不怕找不到了! 实时通知是企业系统中常见的功能,比如:管理员发布通知后,所有用户…...
Linux-进程间的通信
1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...
