news 2026/4/16 10:48:07

13. django中间件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
13. django中间件

1、概述

AOP(Aspect Oriented Programming),面向切面编程,是对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。可以实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。
面向切面编程,就是将交叉业务逻辑封装成切面,利用AOP的功能将切面织入到主业务逻辑中。所谓交叉业务逻辑是指,通用的,与主业务逻辑无关的代码,如安全检查,事物,日志等。若不使用AOP,则会出现代码纠缠,即交叉业务逻辑与主业务逻辑混合在一起。这样,会使业务逻辑变得混杂不清。举个例子:银行系统取款会有一个流程查询也会有一个流程。

Django的中间件,就是应用AOP技术来实现的,它是diango请求/响应处理的钩子框架,是一个轻巧的低级“插件“系统,在不修改diango项目原有代码的基础上可以全局改变diango的输入或输出,每个中间件组件负责执行某些特定功能。
PS:因为中间件改变的是全局,所以需要谨慎实用,滥用的话,会影响到服务器的性能

2、django默认中间件

diango项目默认有一些自带的中间件,如下

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


3、自定义中间件说明

如果需要增加白定义的中间件(该中间件类必须继承MiddlewareMixin (django.utils.deprecation)),一般是添加在系统的中间件之下

如:

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", # 自定义中间件 'my_app.middleware.MyMiddleware' ]

中间件中主要有以下方法(一个中间件类最少需要实现下列方法中的一个):

① process_request:处理请求对象,请求到达diango框架时,第一时间调用多个中间件之间顺序调用
参数:request
返回:
response:调用当前中间件的process_response处理

None:调用下一个中间件的process_request处理

② process_response:处理响应对象,视图函数返回response后,调用多个中间件之间倒序调用

参数:request,response
返回:
response:调用上一个中间件的process_response处理

③ process_view:视图预处理,在视图函数处理之前调用,即请求在urlconf当中匹配到对应的视图函数之后先不调用视图函数,而是先调用此方法
多个中间件之间顺序调用
参数:request,view func,view_args,view_kwargs

view _func: yrl路由匹配到的视图函数,不是字符串,是函数对象

view_args:视图函数的可变参数

view_kwargs:视图函数的可变关键字参数

返回:

response:调用最后一个中间件的process_response开始处理。

None:调用下一个中间件的process_view处理

④ process_exception:在视图函数处理过程抛出异常时调用,中间件的方法(除了process_template_response)中抛出异常不会触发

多个中间件之间倒序调用
参数:request,exception

exception:是处理过程中抛出的异常对象

返回:
response:之后的process exception都不会触发,而是直接调用最后一个中间件的process response处理

None:调用上一个中间件的process exception处理

⑤ process_template_response:默认不执行,在视图函数完成操作后调用,除非视图函数返回的response中有render方法
多个中间件之间倒序调用
参数:request,response
response:不是HttpReponse而是具有render方法的对象,譬如:SimpleTemplateResponse对象,在(django.template.response中)
返回:
response:具有render方法的对象,继续调用上一个中间件的processtemplate response处理,最后一个process_template_response处理完成后,会自动调用response对象中的render方法,得到一个HttpResponse对象,进行返回,再调用processresponse操作

中间件方法的执行时有顺序的,process_request与process_view是按照顺序去执行的,而
process_response、process_exception和process_template_response是反序的

总结:用户请求>>process request>>urlconf路由匹配,找到对应的视图函数>>process _view >>视图函数>> process_template_response(如果视图函数返回的response,有render方法,否则这一步不会执行)>>process response>>返回respanse到用户
其中,在视图函数和 process_template_response 处理过程中,如果出现 exception,那么就会倒序执行中间件的process_exception

4、常见自定义中间件功能

总之,你如果有对全局request或response的操作需求,那么就可以使用中间件,譬如:
1.IP过滤:对一些特定IP地址返回特定响应

2.URL过滤:如果用户访问的是login视图,则通过;如果访问其他视图,需要检测是不是有session已经有了就通过,没有就返回login页面。这样就不用在多个视图函数上写装饰器login_required

3.内容压缩:response内容实现gzip的压缩,返回压缩后的内容给前端

4.CDN:内容分发网络,实现缓存,如果缓存中有数据直接返回,没有找到缓存再去请求视图5.URL过滤:某个子应用升级暂停使用,某个特定的path路径下的请求,返回一个特定页面

5、示例项目

1.新建django项目:middleware_study,子应用:middleware app
2.urls增加路由配置

from django.contrib import admin from django.urls import path from middleware_app import views urlpatterns = [ path("middleware_test/", views.middleware_test), ]

3. views中实现函数:

from django.http import HttpResponse from django.shortcuts import render from django.template.response import SimpleTemplateResponse class MyTemplateResponse(): def render(self): return HttpResponse('MyTemplateResponse') # Create your views here. def middleware_test(request): print("中间件测试") # raise Exception("异常") # return HttpResponse("中间件测试成功") # return SimpleTemplateResponse('middleware_app/index.html') return MyTemplateResponse()

4.增加index.html模板

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <p>SimpleTemplateResponse 测试</p> </body> </html>

5. 建立middlewaretest.py

from django.http import HttpResponse from django.utils.deprecation import MiddlewareMixin class FirstMyMiddleware(MiddlewareMixin): def process_request(self,request): print('FirstMyMiddleware process_request') def process_response(self,request,response): print('FirstMyMiddleware process_response') return response def process_view(self,request,view_func,view_args,view_kwargs): print('FirstMyMiddleware process_view') def process_exception(self,request,exception): print('FirstMyMiddleware process_exception') def process_template_response(self,request,response): print('FirstMyMiddleware process_template_response') return response class SecondMyMiddleware(MiddlewareMixin): def process_request(self,request): print('SecondMyMiddleware process_request') # return HttpResponse('SecondMyMiddleware process_request') def process_response(self,request,response): print('SecondMyMiddleware process_response') return response def process_view(self,request,view_func,view_args,view_kwargs): print('SecondMyMiddleware process_view') # return HttpResponse('SecondMyMiddleware process_view') def process_exception(self,request,exception): print('SecondMyMiddleware process_exception') return HttpResponse('SecondMyMiddleware process_exception') def process_template_response(self,request,response): print('SecondMyMiddleware process_template_response') return response.render() class ThirdMyMiddleware(MiddlewareMixin): def process_request(self,request): print('ThirdMyMiddleware process_request') def process_response(self,request,response): print('ThirdMyMiddleware process_response') return response def process_view(self,request,view_func,view_args,view_kwargs): print('ThirdMyMiddleware process_view') def process_exception(self,request,exception): print('ThirdMyMiddleware process_exception') def process_template_response(self,request,response): print('ThirdMyMiddleware process_template_response') return response

6、示例-URL过滤

1.setting:py文件中的配置


from django.contrib import admin from django.urls import path from middleware_app import views urlpatterns = [ path("middleware_test/", views.middleware_test), path("middleware_url/", views.middleware_url), ]


2.增加upgrade.html模板

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <p>当前系统正在升级,预计2022年1月1日0点0分0秒升级完成,到时欢迎使用!</p> </body> </html>

3. middleware.py


class UrlMyMiddleware(MiddlewareMixin): def process_request(self,request): if request.path.startswith('/middleware_url/'): return render(request,"middleware_app/middleware_url.html")

来源:https://www.bilibili.com/video/BV1o1ygBqESP?spm_id_from=333.788.player.switch&vd_source=559010002481cf347abbb2b3ce57ed44&p=29

免责声明

本文内容为个人在互联网学习过程中整理的笔记,旨在记录学习心得与知识要点。文中部分内容可能参考或引用了网络上的公开资料、教程或他人观点。

版权声明

  1. 原创性声明:本文部分内容为个人总结与理解,但可能包含他人观点或公开资料。
  2. 引用来源:如涉及第三方内容,本人尽力标注来源,但因网络信息庞杂,可能存在遗漏或误用的情况。
  3. 侵权处理:若您认为本文内容侵犯了您的合法权益(如著作权、版权等),请通过以下方式联系本人:
    • 留言:在本文评论区或相关平台留言说明具体情况。

收到通知后,本人将第一时间核实并采取适当措施(如删除或修正相关内容)。

使用说明

  • 本文仅供学习交流使用,请勿用于商业用途。
  • 读者可参考本文内容,但建议结合官方文档或其他权威资料进一步验证。
  • 因个人理解或笔记记录可能存在偏差,请谨慎参考。

感谢您的理解与支持!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 17:34:35

34、Python 数据持久化与序列化:从简单到关系型的全面解析

Python 数据持久化与序列化:从简单到关系型的全面解析 在 Python 编程中,数据持久化和序列化是非常重要的概念,它们允许我们将数据保存到磁盘,以便后续使用。本文将介绍几种不同的数据序列化方法,包括简单序列化和关系型序列化,并通过具体的代码示例进行详细说明。 简单…

作者头像 李华
网站建设 2026/4/12 17:49:34

深度学习的进化之路:从感知机到通用智能的曙光

引言&#xff1a;当机器学会“思考” 2016年3月&#xff0c;AlphaGo以4:1战胜围棋世界冠军李世石&#xff0c;这场历史性的对决不仅震惊了围棋界&#xff0c;更向世界宣告了一个新时代的到来——机器不仅能够执行指令&#xff0c;还能通过“学习”掌握人类数千年来积累的复杂智…

作者头像 李华
网站建设 2026/4/13 23:39:40

前端最新技术,零基础入门到精通,收藏这篇就够了

文章目录 第一阶段&#xff1a;前端入门HTML5 Css3电商网页制作第二阶段&#xff1a;JavaScript系列第三阶段 服务端编程第四阶段 Vue.js第五阶段 小程序第六阶段 React.js 基础 前端学习路线图火热出炉啦&#xff0c;还在为如何系统学习苦苦寻觅资源么&#xff1f; 2021年…

作者头像 李华
网站建设 2026/3/29 23:14:55

Tengine实战指南:如何构建高性能Web服务器与负载均衡系统

Tengine实战指南&#xff1a;如何构建高性能Web服务器与负载均衡系统 【免费下载链接】tengine A distribution of Nginx with some advanced features 项目地址: https://gitcode.com/gh_mirrors/tengi/tengine 当您的Web服务面临高并发访问压力&#xff0c;传统的负载…

作者头像 李华
网站建设 2026/4/15 3:42:27

Tekla Structures智能标注调图插件:5大核心功能全面提升钢结构详图效率

Tekla Structures智能标注调图插件&#xff1a;5大核心功能全面提升钢结构详图效率 【免费下载链接】Tekla自动标注调图插件 Tekla自动标注调图插件是一款专为Tekla Structures设计的强大工具&#xff0c;旨在提升钢结构详图制作效率。该插件能够自动识别详图中的梁、柱、板等元…

作者头像 李华
网站建设 2026/4/3 21:24:46

实战指南:BootstrapBlazor导航组件在企业级应用中的高效运用

实战指南&#xff1a;BootstrapBlazor导航组件在企业级应用中的高效运用 【免费下载链接】BootstrapBlazor 项目地址: https://gitcode.com/gh_mirrors/bo/BootstrapBlazor 技术痛点与价值分析 在现代企业级Web应用开发中&#xff0c;导航系统的设计直接影响用户体验和…

作者头像 李华