Django之中间件

引入

1、Django自带7个中间件,每个中间件都有各自的功能


2、django能够自定义中间件


3、使用场景:

        1. 全局身份校验

        2. 全局用户权限校验

        3. 全局访问频率的校验

        ......

【1】什么是中间件

  • Django中间件是一个轻量级、可重用的组件,用于处理Django请求和响应的过程。
  • 它提供了对请求和响应进行全局处理的机制,可以在请求达到视图之前进行预处理或在响应返回给客户端之前进行后处理。
  • 中间件是按照顺序依次执行的,每个中间件都可以对请求和响应进行修改、补充或处理。
  • 在Django的settings.py配置文件中,通过MIDDLEWARE设置来定义中间件的顺序。

【2】中间件的作用

  • 【2.1】认证和授权

    • 中间件可以在请求到达视图之前进行用户认证和权限认证,只有经过授权的用户才能访问敏感的资源
  • 【2.2】请求响应和处理

    • 中间件可以在请求到达视图之前进行预处理
      • 例如请求头信息,检查请求参数的合法性操作
    • 在视图函数返回响应给客户端之前,中间件还可以对响应进行后处理
      • 通知还可以添加额外的响应头,包装响应数据等操作
  • 【2.3】异常处理

    • 中间件可以捕获视图函数中可能抛出的异常,并做出相应的处理
      • 例:记录异常日志,返回自定义错误信息
  • 【2.4】性能优化

    • 通过中间件,可以对性能进行检测,缓存处理,压缩响应,提升网站整体性能等操作
  • 【2.5】示例

class MyMiddleware:def __init__(self, get_response):self.get_response = get_responsedef __call__(self, request):# 在视图函数调用之前的预处理逻辑# ...response = self.get_response(request)# 在响应返回给客户端之前的后处理逻辑# ...return response

【3】Django中间件是Django的门户

请求操作和响应操作都需要经过中间件

 

1、请求来的时候需要先经过中间件才能真正到达后盾

2、响应返回的时候也要经过中间件后才能才能响应返回出去

【4】Django默认的7个中间件

【4.1】SecurityMiddleware

django.middleware.security.SecurityMiddleware
  • 安全中间件负责处理与网站安全相关的任务
  • 例如设置HTTP头部,防止跨站脚本攻击(XSS),点击劫持等
  • 它可以通过配置自定义安全策略来确保网站的安全性。

【4.2】SessionMiddleware

django.contrib.sessions.middleware.SessionMiddleware
  • 会话中间件负责处理用户会话的创建之间存储和检索用户数据。
  • 它基于浏览器提供的Cookie或URL传递的会话ID进行会话跟踪,并将会话数据存储在后端数据库或缓存中,以实现用户状态的跨请求保持。

【4.3】CommonMiddleware

django.middleware.common.CommonMiddleware
  • 通用中间件提供了一些常见而关键的HTTP请求处理功能
  • 例如,根据请求的HTTP头信息设置语言、时区等。
  • 此外,它还处理静态文件的serving,包括收集静态文件,为其生成URL,并在开发模式下提供静态文件的serving。

【4.4】CsrfViewMiddleware

django.middleware.csrf.CsrfViewMiddleware
  • CSRF(Cross-Site Request Forgery)中间件用于防止跨站请求伪造攻击。
  • 它在每个POST请求中验证一个CSRF标记,确保请求是通过合法的表单提交得到的,从而保护用户免受恶意站点的攻击。

【4.5】AuthenticationMiddleware

django.contrib.auth.middleware.AuthenticationMiddleware
  • 认证中间件负责处理用户身份认证相关的任务
  • 例如将认证信息关联到请求对象上,为每个请求提供一个user对象,以便在请求处理过程中轻松地获取和使用用户身份信息。

【4.6】MessageMiddleware

django.contrib.messages.middleware.MessageMiddleware
  • 消息中间件用于在请求处理过程中存储和传递临时的、一次性的用户消息。
  • 它允许在HTTP重定向之间跨请求传递消息,例如成功或错误提示,以改善用户体验。

【4.7】XFrameOptionsMiddleware

django.middleware.clickjacking.XFrameOptionsMiddleware
  • 点击劫持中间件用于防止页面被嵌入到其他网站中,从而提供一定的点击劫持保护。
  • 它通过设置X-Frame-Options HTTP头部来限制页面的显示方式,从而防止恶意网页通过iframe等方式嵌入当前网页。

【5】中间件方法(5个) 

【5.1】process_request  ------- 必须掌握

  • (1)执行顺序
    • 按照配置文件中的中间件从上往下执行
    • 每一个请求来的时候都需要经过process_request方法
    • 该方法有一个request参数
  • (2)没有定义process_request方法
    • 没有定义就直接跳过process_request
  • (3)定义了返回值
    • 如果在自定义的中间件中定义了返回了,那么请求将不再继续执行
  • (4)总结
    • process_request方法就是用来做全局相关的所有限制功能
    • 该方法在每个请求到达视图之前被调用,可以对请求进行预处理。
    • 它接收一个HttpRequest对象作为参数,并且没有返回值。

例:

class AuthenticationMiddleware:def process_request(self, request):# 在这里进行身份验证操作if not request.user.is_authenticated:# 如果用户未经身份验证,则返回HttpResponse或重定向到登录页面

【5.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

【5.3】process_view

  • 路由匹配成功后执行视图函数之前
  • 会自动执行中间件里面的该方法
  • 顺序是按照配置文件中注册的中间件从上而下的顺序执行
  • 该方法在请求到达视图之前被调用,在视图函数执行前执行。
    • 可以在此处进行一些操作
    • 如修改请求参数或进行记录等。
  • 它接收一个HttpRequest对象和一个视图函数作为参数,并且可以返回一个HttpResponse对象或None。

示例:

class LoggingMiddleware:def process_view(self, request, view_func, view_args, view_kwargs):# 在这里记录日志logger.info(f"Request received: {request.path}")# 返回None,继续执行原视图函数return None

【5.4】process_template_response

  • 返回的 HttpResponse 对象有 render 属性的时候才会触发
  • 顺序是按照配置文件中注册了的中间件从下往上依次经过
  • 该方法在视图函数返回一个TemplateResponse对象时调用。
    • 可以在此处修改模板响应
    • 例如添加全局的上下文数据或进行额外的渲染操作。
  • 它接收一个HttpRequest对象和一个TemplateResponse对象作为参数,并且必须返回一个TemplateResponse对象。

示例:

class GlobalContextMiddleware:def process_template_response(self, request, response):# 在这里添加全局的上下文数据response.context_data['global_data'] = "Global Value"return response

【5.5】process_exception

  • 当视图函数中出现异常的情况下触发
  • 顺序是按照配置文件中注册了的中间件从下往上依次经过
  • 该方法在视图函数抛出异常时被调用。
    • 可以在此处捕获异常并进行处理
    • 例如返回一个定制的错误页面或进行日志记录等。
  • 它接收一个HttpRequest对象和一个异常对象作为参数,可以返回一个HttpResponse对象来替代原始的异常响应。

示例:

class ErrorHandlerMiddleware:def process_exception(self, request, exception):# 在这里处理异常if isinstance(exception, CustomException):# 如果自定义异常,返回一个定制的错误页面return render(request, 'error.html', {'error': str(exception)})else:# 默认情况,返回一个500服务器错误return HttpResponseServerError("Internal Server Error")

【6】自定义中间件

        第一步:在视图文件中新建一个视图函数

def index(request):print("这是视图函数index")return HttpResponse("index 的返回值")

        第二步:在路由文件中配置路由

from app01 import viewsurlpatterns = [path('admin/', admin.site.urls),path('index/',views.index),
]

        第三步:创建一个py文件,在py文件中写自定义中间件

# -*-coding: Utf-8 -*-
# @File : my_middle .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time:2023/7/17# 引入父类
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 方法")

        注意:在自定义中间件的时候必须要继承父类MiddlewareMixin

        

        引入父类:

from django.utils.deprecation import MiddlewareMixin

第四步:在配置文件的中间件中加入自定义中间件

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',
]

【6.1】总结

1、如果在第一个 process_request 方法就已经返回了 HttpResponse 对象,那么响应被返回的时候是经过所有的中间件里面的 process_response 方法还是会发生其他?

        

                会直接走同级别的 process_response 方法 ,然后直接返回

2、flask框架的中间件也有一个类似的方法

        

        但是flask返回数据就必须经过所有中间件里面的 process_response 方法

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

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

相关文章

python运行jackhmmer二进制命令的包装器类

jackhmmer 是 HMMER 软件套件中的一个工具,用于进行高敏感度的蛋白质序列比对。HMMER(Hidden Markov Model based on profile)是一套用于分析蛋白质序列的工具,它使用隐藏马尔可夫模型(HMM)来建模蛋白质家族…

nodejs微信小程序+python+PHP -留学信息查询系统的设计与实现-安卓-计算机毕业设计

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

543. 二叉树的直径 --力扣 --JAVA

题目 给你一棵二叉树的根节点,返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 解题思路 最长长度可以理解为左子树最长路径加上右子树最长…

MySQL错误之ONLY_FULL_GROUP_BY

报错信息: 翻译: 对该报错的解释 所以,实际上该报错是由于在SQL查询语句中有group by,而这个包含group by的SQL查询写的并不规范导致的,这个ONLY_FULL_GROUP_BY模式开启之后检查就会很严格,如果select列表…

uniapp为什么能支持多端开发?uniapp底层是怎么做的?

文章目录 前言uniapp为什么能支持多端开发?uniapp底层是怎么做条件编译uniapp的语法uniapp如何编译为不同端的代码uniapp的底层是如何做平台特性适配的呢?后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:uniapp &…

【lua】记录函数名和参数(为了延后执行)

需求背景 一个服务缓存玩家信息到对象里,通过对象的函数定时同步到数据库中,如果玩家掉线 清空对象,但是后续步骤导致对象数据需要变更,对象不存在, 就不方便变更了,怎么处理? 方案思考 1.临…

计算机网络——路由

文章目录 1. 前言:2. 路由基础2.1. 路由的相关概念2.2. 路由的特征2.3. 路由的过程 3 路由协议3.1. 静态路由:3.2. 动态路由:3.2.1. 距离矢量协议3.2.2. OSPF协议:3.2.2.1.OSPF概述OSPF的工作原理路由计算功能特性 3.2.2.2.OSPF报…

【Kafka】Java整合Kafka

1.引入依赖 <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>2.3.1</version></dependency> 2.搭建生产者 package com.wen.kafka;import org.apache.kafka.clients.produ…

Vuejs+ElementUI搭建后台管理系统框架

文章目录 1. Vue.js 项目创建1.1 vue-cli 安装1.2 使用 vue-cli 创建项目1.3 文件/目录介绍1.4 启动 Web 服务 2. 集成 Vue Router 前端路由2.1 Vue Router 是什么2.2 集成 Vue Router 方法2.3 使 Vue Router 生效 3. 集成 Vuex 组件3.1 Vuex 是什么3.2 集成 Vuex 方法3.3 使 V…

2023全球数字贸易创新大赛-人工智能元宇宙-4-10

目录 竞赛感悟: 创业的话 好的项目 数字工厂,智慧制造:集群控制的安全问题

dlv 安装与使用

dlv 安装 第一步&#xff1a; # git clone https://github.com/go-delve/delve # cd delve # make install 第二步&#xff1a; # ln -s /root/go/bin/dlv /usr/local/bin/dlv 第三步&#xff1a; # dlv version Delve Debugger Version: 1.21.2 Build: d6f215b27b6d8a4e4…

Excel中出现“#NAME?”怎么办?(文本原因)

excel 单元格出现 #NAME? 错误的原因有二&#xff1a; 函数公式输入不对导致 #NAME? 错误。 在单元格中字符串的前面加了号&#xff0c;如下图中的--GoJG7sEe6RqgTnlUcitA&#xff0c;本身我们想要的是--GoJG7sEe6RqgTnlUcitA&#xff0c;但因为某些不当的操作在前面加了号&…

vue+SpringBoot的图片上传

前端VUE的代码实现 直接粘贴过来element-UI的组件实现 <el-uploadclass"avatar-uploader"action"/uploadAvatar" //这个action的值是服务端的路径&#xff0c;其他不用改:show-file-list"false":on-success"handleAvatarSuccess"…

万界星空科技商业开源MES/免费MES/低代码MES

万界星空科技商业开源MES可以提供包括制造数据管理、计划排程管理、生产调度管理、库存管理、质量管理、人力资源管理、工作中心/设备管理、工具工装管理、采购管理、成本管理、项目看板管理、生产过程控制、底层数据集成分析、上层数据集成分解等管理模块&#xff0c;打造一个…

141.【Git版本控制-本地仓库-远程仓库-IDEA开发工具全解版】

Git-深入挖掘 (一)、Git分布式版本控制工具1.目标2.概述(1).开发中的实际常见(2).版本控制器的方式(3).SVN (集中版本控制器)(4).Git (分布版本控制器)(5).Git工作流程图 (二)、Git安装与常用命令1.Git环境配置(1).安装Git的操作(2).Git的配置操作(3).为常用的指令配置别名 (可…

element中el-switch的v-model自定义值

一、问题 element中的el-switch的值默认都是true或false&#xff0c;但是有些时候后端接口该字段可能是0或者1&#xff0c;如果说再转换一次值&#xff0c;那就有点太费力了。如下所示&#xff1a; <template><el-switchinactive-text"否"active-text&quo…

【Seata源码学习 】篇四 TM事务管理器是如何开启全局事务

TM发送 单个或批量 消息 以发送GlobalBeginRequest消息为例 TM在执行拦截器链路前将向TC发送GlobalBeginRequest 消息 io.seata.tm.api.DefaultGlobalTransaction#begin(int, java.lang.String) Overridepublic String begin(String applicationId, String transactionServi…

操作系统发展过程--单道批处理系统、多道批处理系统、分时系统、实时系统

一、单道批处理系统 计算机早期&#xff0c;为了能提高利用率&#xff0c;需要尽量保持系统的连续运行&#xff0c;即在处理完一个作业之后&#xff0c;紧接着处理下一个作业&#xff0c;以减少机器的空闲等待时间 1.单道批处理系统的处理过程 为了实现对作业的连续处理&…

51单片机应用从零开始(七)·循环语句(if语句,swtich语句)

51单片机应用从零开始&#xff08;一&#xff09;-CSDN博客 51单片机应用从零开始&#xff08;二&#xff09;-CSDN博客 51单片机应用从零开始&#xff08;三&#xff09;-CSDN博客 51单片机应用从零开始&#xff08;四&#xff09;-CSDN博客 51单片机应用从零开始&#xff08;…

数仓成本下降近一半,StarRocks 存算分离助力云览科技业务出海

成都云览科技有限公司倾力打造了凤凰浏览器&#xff0c;专注于为海外用户提供服务&#xff0c;公司致力于构建一个全球性的数字内容连接入口&#xff0c;为用户带来更为优质、高效、个性化的浏览体验。 作为数据驱动的高科技公司&#xff0c;从数据中挖掘价值一直是公司核心任务…