Django 中间件 Middleware

从示波器波形看懂CAN/RS485/RS422:一个TVS管放错位置,通信全挂的教训 本文通过示波器波形分析,深入探讨了CAN/RS485/RS422通信系统中TVS管布局错误的故障诊断与解决方案。文章详细解析了错误布局导致的波形特征,如信号钳位、阻抗失配等,并提供了正确的保护电路设计方案和终端匹配技术,帮助工程师快速定位和解决通信故障。 阅读详情

一、中间件

Middleware是Django请求/响应处理的插件框架。它是一个轻巧的低级"插件"系统,用于全局改变Django的输入或输出。

每个中间件组件负责执行某些特定功能。例如,Django包含一个中间件组件 AuthenticationMiddleware,它将用户与使用会话的请求相关联。

该文档介绍了中间件的工作原理,如何激活中间件以及如何编写自己的中间件。Django附带了一些你可以直接使用的内置中间件。它们记录在内置中间件参考中


二、激活中间件

要激活中间件,请将其添加到MIDDLEWARE Django设置中的列表中
如下,我激活了三个中间件 Middleware.test.m1,Middleware.test.m2,Middleware.test.m3

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',
    'Middleware.test.m1',
    'Middleware.test.m2',
    'Middleware.test.m3',
]

三、中间件请求和响应

在请求阶段,调用views之前,django按照MIDDLEWARE_CLASSES中定义的顺序从上到下调用中间件。

在Django中间件中,总共有分为从上到下hooks和从下到上hooks

从上到下hooks:

  • process_request()
  • process_view()

从下到上hooks:

  • process_exception()
  • process_template_response()
  • process_response()

四、中间件处理流程说明(如下述的middleware)
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',
    'Middleware.test.m1',
    'Middleware.test.m2',
    'Middleware.test.m3',
]

一个中间件最少有一个process_request hooks和一个process_response hooks,前者是用来处理请求的,后者是用来处理响应的

那除了必须的两个hooks以外,还有其他三个hooks,分别是 process_view, process_exception, process_template_response

process_view 主要是用来执行middleware中具体的处理函数,如中间件请求中所说,是从上到下的hooks,表示process_view在views视图函数之前执行

process_exception 一般情况下不会执行,只有在views视图函数中出现exception异常时,才会执行;如中间件请求中所说,是从下到上的hooks,表示processs_exception在views视图函数之后执行,也就是views视图函数出错之后,才会执行

processs_template_response 一般情况下也不会执行,也就是说,只有views中的函数返回对象中具有render方法,它才会执行


五、中间件处理顺序(如下述的middleware)
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',
    'Middleware.test.m1',
    'Middleware.test.m2',
    'Middleware.test.m3',
]

1、process_request 阶段
当一个用户发起请求后,该请求会经过上述的所有中间件,并且自上而下执行;先执行所有中间件的 process_request方法,该方法如果返回HttpResponse,则执行从当前的中间件向上执行 process_responsse,如果返回None,则接着向下执行 process_request

2、process_view 阶段
当该用户的请求执行完所有中间件 process_request 方法后,如果返回都为None,那么接下来会执行所有中间件的 process_view 方法,如果其中一个 process_view 返回HttpResponse,则会跳过接下来所有中间件的 process_view,直接会从最下面的process_response自下而上执行,如果process_view返回None,则会继续向下执行

3、views 阶段
当该用户的请求执行完所有的process_request和process_view阶段,并且没有返回HttpResponse;换句话说,返回的都是None,那么这个时候就会到达views视图函数

在这里,可能会有三种可能性
(1) views中的函数返回对象中具有render方法
(2) views中的函数产生异常
(3) views中的函数返回对象中具有render方法,并且views中的函数产生异常

当出现第一种情况的时候,函数就会开始执行所有中间件的 process_template_response 方法,并且自下而上在每个中间件中挨个执行(当有定义 process_template_response 方法的时候)
当出现第二种情况的时候,函数就会开始执行所有中间件的 process_exception 方法,并且自下而上在每个中间件中挨个执行(当有定义 process_exception 方法的时候)
当出现第三种情况的时候,函数就会自下而上同时执行所有中间件中定义的 process_exception 和 process_template_response 方法(在这个时候会优先执行所有中间件中的process_template_response 方法,再执行所有中间件中的process_exception方法)

4、process_response 阶段
当 process_request, process_view,views,process_template_response,process_exception 方法都执行完成后,开始自下而上从中间件中执行 process_response 方法,直到最上层中间件的 process_response 方法执行完毕,接着返回给用户


六、Django 自定义中间件

1、在settings中定义三个中间件


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',
    'Middleware.test.m1',
    'Middleware.test.m2',
    'Middleware.test.m3',
]

2、创建中间件路径

在项目跟路径下面创建中间件路径
./Middleware/test.py


3、定义中间件

from django.utils.deprecation import MiddlewareMixin
from django.http import HttpResponse

class m1(MiddlewareMixin):
    def process_request(self, request):
        print('m1 request')

    def process_view(self, request, func_view, func_args, func_kwargs):
        print('m1 view')

    def process_response(self, request, response):
        print('m1 response')
        return response

    def process_exception(self, request, exception):
        print('m1 exception')

    def process_template_response(self, request, response):
        print('m1 template response')
        return response


class m2(MiddlewareMixin):
    def process_request(self, request):
        print('m2 request')

    def process_view(self, request, func_view, func_args, func_kwargs):
        print('m2 view')

    def process_response(self, request, response):
        print('m2 response')
        return response

    def process_exception(self, request, exception):
        print('m2 exception')

    def process_template_response(self, request, response):
        print('m2 template response')
        return response


class m3(MiddlewareMixin):
    def process_request(self, request):
        print('m3 request')

    def process_view(self, request, func_view, func_args, func_kwargs):
        print('m3 view')

    def process_response(self, request, response):
        print('m3 response')
        return response

    def process_exception(self, request, exception):
        print('m3 exception')

    def process_template_response(self, request, response):
        print('m3 template response')
        return response

4、定义视图函数

class Foo:
    def render(self):
        int('v')
        return HttpResponse('OK')

def middleware(request):
    #return render(request, 'login.html')
    #return HttpResponse('middleware')
    return Foo()

七、一个请求经过中间件的请求周期

由于views视图函数中有个报错需要触发中间件中定义的 process_exception 方法,所以便于展示执行顺序,我去除了具体的报错内容

m1 request
m2 request
m3 request
m1 view
m2 view
m3 view
m3 template response
m2 template response
m1 template response
m3 exception
m2 exception
m1 exception
m3 response
m2 response
m1 response


八、结论

大家可根据自己需求自行编写中间件,并且测试中间件中每个方法的执行顺序,总共有5个方法,分别为
process_request
process_view
process_template_response
process_exception
process_response

另外:
Django 官方不建议在中间件层处理 request.POST 数据,csrf中间件是个例外,因为要全局安全处理用户token

Nmap源码分析(端口扫描) 端口扫描是Nmap的核心功能,用于确定目标机的端口状态(开放、关闭、过滤等),也为Nmap的服务与版本扫描、OS扫描、脚本扫描提供基本的指引信息。所以,深入理解端口扫描的实现对分析其他的扫描方式很有帮助。 1简单回顾   首先简要回顾一下端口扫描的原理以及命令行选项。 1.1扫描原理   Nmap提供的10多种类型的端口扫描方法,如TCP SYN/ACK/FIN/Xmas/NULL/ Windows/Connect,FTP Bounce, Idle scan, UDP port u... 阅读详情

相关推荐

【顾邦小讲堂】第十九期 RC Snubber吸收电路详解:抑制MOSFET振铃现象与过冲的设计技巧!

通过RC Snubber电路有效抑制MOSFET DS端的过冲及振铃现象,帮助工程师们在设计中提升电路的稳定性和可靠性

GBupupup的博客 3789

Myeclipse tomcat 部署项目报错

Deployment is out of date due to changes in the underlying project contents……项目是没有什么问题的,至于jar包也是没有问题的查了很久居然是。。。 运行的时候选择管理员运行myeclipse可能是安装的时候没有指定用户,设置成管理员权限后再部署就没有什么问题了

pureSky的博客 813

海思芯片OpenHarmony系统移植:Sensor传感器模块HDF驱动配置HCS文件详解

海思系列芯片的传感器模块通过HDF(Hardware Driver Foundation)驱动框架进行管理和配置。传感器HCS(HDF Configuration Source)配置文件定义了各类传感器的硬件参数、总线配置、寄存器序列等信息,为传感器驱动提供必要的初始化和运行参数。海思系列芯片适配OpenHarmony的传感器HDF配置HCS文件是传感器驱动开发的关键部分,通过合理配置可以实现各种传感器设备的驱动支持。

m0_67505153的博客 209

python middleware模块_python – Django – 不正确的配置:模块“django.contrib.auth.middleware”...

我正在运行一个virtualenv来尝试学习Django,但无论什么原因,安装Django之后,当我尝试访问默认的Django起始页时,我在浏览器中收到以下错误:A server error occurred. Please contact the administrator.在运行服务器的终端窗口中,出现以下错误:ImproperlyConfigured: Module “django.cont...

weixin_33570610的博客 527

UG NX二次开发(C#)-VS2022配置NX二次开发模板不能正常显示的问题

随着VS2022的发布,使用VS2022进行UG NX二次开发的人员也会越来越多,但是由于VS2022和以前的VS版本采用代码结构不同,而UG NX的二次开发编程模板还没有适应于VS2022的模板配置,所以不能正常的创建一个完整的工程。本文采用曲线救国的方式来实现VS2022下的UG NX二次开发。如果有读者能很好的解决模板配置,不吝赐教。

GimiGimmy 4276

【CANdelaStudio编辑CDD】-1.2-给$10服务SessionControl创建一个新Session会话并修改Session state machine会话状态机(UDS诊断)

前一篇:【UDS诊断描述文件CDD】-1.1-ISO_14229中$10服务理论部分https://blog.csdn.net/qfmzhu/article/details/120375515案例背景: 在CDD中如何给$10服务创建一个新的Session会话; 在CDD中如何给$10服务修改Session state machine会话状态机。 目录 1 查看$10服务中已有的Session会话​ 2 查看$10服务中已有的Session state machine会话状态机 3 在$10...

「汽车电子助手」的博客 6077

10.Django之中间件

1. Django请求生命周期 2. 中间键 中间键是django的门户. 1. 请求来的时候需要先进过中间件才能到达真正的django后端。 2. 响应走的时候也需要经过中间件才能发送出去. # settings.py 默认有七个中间键 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', '

清风 1427

【数据集】1980-2020年(5年)土地利用分类数据-中国科学院

简介1980-2020年每五年土地利用数据-中国科学院

WW、forever的博客 3934

Django中Middleware中间件

1 Middleware中间件概述 django中间middleware实质就是一个类,django会根据自己的规则在合适的时机执行中 提前处理,此时中间件就上场了。 django在settings模块中,有一个MIDDLEWARE_CLASSES变量,其中每一个元素就是一个中间件。 在settings.py文件中: MIDDLEWARE = [ 'django.middl...

诚实可靠小郎君 859

uniapp(vue3):实现手机拍照或相册图片上传后给图片添加水印,uniapp实现多端图片上传、拍照上传自定义插入水印内容,调用手机摄像头打开相机并在周围悬挂自定义水印(支持文字水印/图片水印等)

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,uni-app为图片添加自定义水印(解决生成图片不全问题),uniapp上传图片添加水印,uniapp H5实现手机拍照或相册上传图像并添加自定义水印,uniapp水印相机,uni-app为图片添加自定义水印,怎么在图片上加水印,图片水印,上传照片带水印,从相册选择图片加水印功能,拍完照片给图片加水印,添加照片水印,uniapp图片加水印,为图片添加自定义水印,uni-app上传图片并添加水印,上传图

✅ 精选推荐文章 3265

43、基于机器学习的GNSS信号质量监测方法

本文提出了一种基于支持向量机(SVM)的GNSS信号质量监测方法,旨在有效检测邪恶波形(EWF)威胁并抑制多径干扰对导航精度的影响。通过构建包含现场采集与合成数据的数据集,结合11个相关器测量值、链路预算、仰角和方位角等特征,采用RBF核函数的SVM模型进行分类。研究评估了不同平滑时间窗口对漏检率和误报率的影响,结果表明在约35-40秒平滑时间下性能趋于稳定,并可通过多数投票机制进一步优化检测性能。该方案适用于星载GNSS接收器,在计算资源受限条件下实现了高可靠性与低完整性风险的平衡。

yyy34的博客 190

Django 源码小剖: 初探中间件(middleware)

因为考虑到文章的长度, 所以 BaseHandler 的展开被推迟了. 在 BaseHandler 中隐藏着中间件的信息, 较常见的 SessionMiddleware 就已经默认安装.  BaseHandler 的展开主要是以代码为主, 但已经加入了注释; 文章的最后附一张美图 . 最后, 祝程序员们节日快乐, 别太宅了 ;) BaseHandler 详解 BaseHandler 在 dj...

weixin_34392906的博客 252

C#实现自己的远程桌面控制工具

1. 创建一个winform工程并添加RDP客户端COM组件。右击工具箱,然后点击选择项,选中下图所示组件并点击确定。为窗口加载时添加自动连接远程桌面代码。3.调试运行程序,验证远程桌面控制。拖放RDP控件到窗口中。2.编写远程桌面连接代码。

6090

Django middleware中间件

1.什么是Django中间件 2.Django中间件的执行逻辑 3.实现自定义中间件 1.什么是DJango中间件 Django中间件是一个类; 请求前后在合适的时机执行相应的方法; 可以通过在settings文件中配置MIDDLEWARE_CLASSES属性来设置使用何种中间件。 MIDDLEWARE = [ # 安全中间件,处理请求应答安全的处理 'django.middleware...

jstang的博客 3811

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

django<MiddleWare中间件>

MiddleWare中间件 1、Middleware中间件概述 django中间middleware实质就是一个类,django会根据自己的规则在合适的时机执行中 提前处理,此时中间件就上场了。 django在settings模块中,有一个MIDDLEWARE_CLASSES变量,其中每一个元素就是一个中间件。 在settings.py文件中: ...

Doris-wxy 261

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Django中间件Middleware

文章目录django中间件一、中间件详细分析1.django配置文件`settings.py`2.自定义中间件`middleware.py`3.注意事项:4.看图分析二、简化版,以及参数分析三、应用实例 django中间件 一、中间件详细分析 1.django配置文件settings.py # settings.py MIDDLEWARE = [ 'django.middleware.se...

AggressionStorm的博客 29万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Django中间件MiddleWare

一、什么是中间件   中间件是一个用来处理Django的请求和响应的框架级别的钩子。   中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法。 我们一直都在使用中间件,只是没有注意到而已,打开Django项目的Settings.py文件,看到下图的MIDDLEWARE配置项。 ...

weixin_30312557的博客 171

Django 中间件Middleware

中间件(Middleware) 用法:     django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。 setting.py MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'dja...

wbdream's heaven 285

小白IT:Django框架—中间件Middleware

文章目录一、Djang中的中间件1.为什么使用中间件2.中间件介绍Django请求响应的生命周期二、自定义中间件1.中间件可重写的方法2.中间件使用自定义中间件settings中配置自定义中间件process_request多个中间件中process_request方法的执行过程视图函数loginmiddlewares.py文件settings.py中配置自定义中间件process_response多个中间件中process_response方法的执行过程request中主动返回HttpResponse运行

yidianyidei的博客 2942

Django Middleware 中间件

Django Middleware中间件 中间件字符串导入方式settins.py -> MIDDLEWARE 中间件的放置位置 用户请求时,最先是从中间件,全部按顺序执行中间件又有两种,接收和返回的 接收请求的中间件,request 返回请求的中间件, response 请求过来: 中间件:拦截一部分请求;比如验证session, 没有登录的 ...

diaoqin7781的博客 263

python middleware模块_django之中间件middleware

django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES变量,其中每一个元素就是一个中间件,如下图。与mange.py在同一目录下的文件夹 xxx/middleware下的auth.py文件中...

weixin_39754398的博客 189

Django Middleware中间件

中间件Middleware 中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性,其它的MVC框架也有这个功能 Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出 使用场景: 1)当某些操作在每次请求或响应时都会执行时,可以写在中间件里面 比如,每次发送post请求都要进行CSRF验证,就把CSRF验证的代码写在中间件中 设计思想: 1)面向切面编程、无侵害式编程 2)不用直接修改框架源码,就可以达到自己

weixin_47906106的博客 372

中间件Django Middleware

中间件的原理 配置中间件 首先先新建一个py文件: from django.utils.deprecation import MiddlewareMixin class MyMiddleware(MiddlewareMixin): def __init__(self,get_response=None): super().__init__(get_response) ...

dremcl的博客 182

django 浅谈中间件 middleware

django中有中间件middleware在我们项目settings中的 MIDDLEWARE中 下面浅谈各个中间件含义以及自定义用法: django.middleware.security.SecurityMiddleware’ 一些安全设置,比如XSS脚本过滤。 django.contrib.sessions.middleware.SessionMiddleware se...

DevOps 2296

Django MiddleWare中间件

# 导入中间件 from django.utils.deprecation import MiddlewareMixin from django.shortcuts import redirect # 继承MiddlewareMixin class LoginMiddleWare(MiddlewareMixin): # 进路由对应的方法之前 def...

aixie0138的博客 138

Django中的中间件(middleware)

一、middleware(中间件) 1、什么是中间件 问题:如何过滤掉没有登陆就访问其他页面? 解决方法 使用装饰器(但是我们要过滤的页面很多,这个方法就很不方便了) 使用中间件(使用此方法要注意,中间件是全局操作,所以要慎用) 概念: 中间件是一个用来处理Django的请求和响应的一个类,可以改变全局范围内Django的输入和输出。简单理解就是中间件是帮助我们在视图函数执行之前和执...

Taneost的博客 431
上一篇: Django CSRF 说明与配置
下一篇: Django 缓存 Cache
亦非我所愿丶
博客等级 码龄11年 250粉丝 216原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值