以下内容整理自菜鸟教程

Django 中间件是修改 Django request 或者 response 对象的钩子,可以理解为是介于 HttpRequest 与 HttpResponse 处理之间的一道处理过程。

浏览器从请求到响应的过程中,Django 需要通过很多中间件来处理,可以看如下图所示:

Django 中间件作用:

  • 修改请求,即传送到 view 中的 HttpRequest 对象。
  • 修改响应,即 view 返回的 HttpResponse 对象。

自定义中间件

中间件可以定义四个方法,分别是:

process_request(self,request)
process_view(self, request, view_func, view_args, view_kwargs)
process_exception(self, request, exception)
process_response(self, request, response)

自定义中间的步骤:

在 app 目录下新建一个 py 文件,名字自定义,并在该 py 文件中导入 MiddlewareMixin:

from django.utils.deprecation import MiddlewareMixin

自定义的中间件类,要继承父类 MiddlewareMixin

class MD1(MiddlewareMixin):

在 settings.py 中的 MIDDLEWARE 里注册自定义的中间件类


当配置多个中间件时,会按照 MIDDLEWARE中 的注册顺序,也就是列表的索引值,顺序执行。

不同中间件之间传递的 request 参数都是同一个请求对象。

1、process_request 方法

process_request 方法有一个参数 request,这个 request 和视图函数中的 request 是一样的。

process_request 方法的返回值可以是 None 也可以是 HttpResponse 对象。

  • 返回值是 None 的话,按正常流程继续走,交给下一个中间件处理。
  • 返回值是 HttpResponse 对象,Django 将不执行后续视图函数之前执行的方法以及视图函数,直接以该中间件为起点,倒序执行中间件,且执行的是视图函数之后执行的方法。

process_request 方法是在视图函数之前执行的。
正常的情况下按照绿色的路线进行执行,假设中间件1有返回值,则按照红色的路线走,直接执行该类下的 process_response 方法返回,后面的其他中间件就不会执行。

2、process_response 方法

process_response 方法有两个参数,一个是 request,一个是 response,request 是请求对象,response 是视图函数返回的 HttpResponse 对象,该方法必须要有返回值,且必须是response。

process_response 方法是在视图函数之后执行的。

3、process_view 方法

process_view 方法有四个参数:

  • request 是 HttpRequest 对象。
  • view_func 是 Django 即将使用的视图函数。
  • view_args 是将传递给视图的位置参数的列表。
  • view_kwargs 是将传递给视图的关键字参数的字典。
    view_args 和 view_kwargs 都不包含第一个视图参数(request)。

process_view 方法是在视图函数之前,process_request 方法之后执行的。

返回值可以是 None、view_func(request) 或 HttpResponse 对象。

  • 返回值是 None 的话,按正常流程继续走,交给下一个中间件处理。
  • 返回值是 HttpResponse 对象,Django 将不执行后续视图函数之前执行的方法以及视图函数,直接以该中间件为起点,倒序执行中间件,且执行的是视图函数之后执行的方法。
  • 返回值是 view_func(request),Django 将不执行后续视图函数之前执行的方法,提前执行视图函数,然后再倒序执行视图函数之后执行的方法。当最后一个中间件的 process_request 到达路由关系映射之后,返回到第一个中间件 process_view,然后依次往下,到达视图函数。

4、process_exception 方法

参数说明:

  • request 是 HttpRequest 对象。
  • exception 是视图函数异常产生的 Exception 对象。

process_exception 方法只有在视图函数中出现异常了才执行,按照 settings 的注册倒序执行。

在视图函数之后,在 process_response 方法之前执行。

process_exception 方法的返回值可以是一个 None 也可以是一个 HttpResponse 对象。

  • 返回值是 None,页面会报 500 状态码错误,视图函数不会执行。process_exception 方法倒序执行,然后再倒序执行 process_response 方法。
  • 返回值是 HttpResponse 对象,页面不会报错,返回状态码为 200。视图函数不执行,该中间件后续的 process_exception 方法也不执行,直接从最后一个中间件的 process_response 方法倒序开始执行。若是 process_view 方法返回视图函数,提前执行了视图函数,且视图函数报错,则无论process_exception 方法的返回值是什么,页面都会报错, 且视图函数和 process_exception 方法都不执行。直接从最后一个中间件的 process_response 方法开始倒序执行:

【Django】中间件相关推荐

  1. Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)

    摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...

  2. 利用django中间件CsrfViewMiddleware防止csrf攻击

    一.在django后台处理 1.将django的setting中的加入django.contrib.messages.middleware.MessageMiddleware,一般新建的django项 ...

  3. 实习笔记0708 https协议/ django中间件/接口测试/内网与外网/域名系统DNS

    1 https协议 https://www.cnblogs.com/superfeeling/p/11561340.html https://www.cnblogs.com/an-wen/p/1118 ...

  4. django 中间件的使用

    django 中间件的使用 Django 在中间件中预置了六个方法,这六个方法的区别在于不同的阶段执行,对输入或输出进行干预,方法如下: (1)初始化:无需任何参数,服务器响应第一个请求的时候调用一次 ...

  5. 【python】-- Django 中间件、缓存、信号

    Django  中间件.缓存.信号 一. Django  中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的 ...

  6. Django 2.0 学习(20):Django 中间件详解

    Django 中间件详解 Django中间件 在Django中,中间件(middleware)其实就是一个类,在请求到来和结束后,Django会根据自己的规则在合适的时机执行中间件中相应的方法. 1. ...

  7. Django - 中间件

    Django - 中间件 一. 什么是中间件 官方: 中间件是一个用来处理Django的请求和相应的框架级别的钩子, 他是一个轻量, 低级别的插件系统, 用于在全局范围内改变Django的输入和输出, ...

  8. Django中间件与python日志模块 介绍

    一.Django中间件 1.1 介绍 Django中的中间件是一个轻量级.底层的插件系统,介于request与response处理之间的一道处理过程(用来处理特定业务的请求和响应).中间件的设计为开发 ...

  9. django CBV装饰器 自定义django中间件 csrf跨站请求伪造 auth认证模块

    CBV加装饰器 第一种 @method_decorator(装饰器) 加在get上 第二种 @method_decorator(login_auth,name='get') 加在类上 第三种 @met ...

  10. Python 之 Django框架( Cookie和Session、Django中间件、AJAX、Django序列化)

    12.4 Cookie和Session 12.41 cookie Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务 ...

最新文章

  1. 爬取知乎“凡尔赛语录”话题下的所有回答,我知道点开看你的很帅气,但还是没我帅
  2. 兰蔻和雅诗兰黛哪个好_兰蔻、雅诗兰黛、修丽可,这些大牌护肤品,你会选择谁?...
  3. 【通俗理解】锁存器,触发器,寄存器和缓冲器的区别
  4. 你还不知道Redis 高延迟时发生了啥嘛?
  5. 响应式网页设计简单入门
  6. 《硝烟中的Scrum和XP》学习手札
  7. php 芝麻认证think_PHP 芝麻信用接入的注意事项
  8. 绿地深蓝机器人_人工智能企业深兰科技获绿地控股3亿元战略投资
  9. matlab 离散傅里叶变换_时域上的采样VS频域上的周期延拓。用离散傅里叶变换直观地演示...
  10. 全面挖掘Java Excel API 使用方法
  11. AD9在元件库封装库添加LOGO
  12. matlab机器学习基础
  13. wifi工具iw常用操作
  14. 千千静听播放器下载2015 v9.1.6 官网最新版
  15. 面对满天繁星似的知识.如何做到老虎吃天
  16. 勘误《新概念》III
  17. PPT模板下载100套欧美风云盘下载
  18. cas112-79-4/中介四(3-羟基苯基)卟吩/5,10,15,20-四(3-羟基苯基)卟啉/MESO-四(间-苯酚)卟啉/3,3‘,3‘‘,3‘‘‘-(卟啉-5,10,15,20-四基)四酚
  19. SpringBoot参数校验--List类型
  20. 收集的一些GIS数据网站

热门文章

  1. Linux 获取上个月的第一秒和上个月的最后一秒
  2. 向量数据库入坑指南:初识 Faiss,如何将数据转换为向量(一)
  3. [Netty] Selector选择器以及Reactor实现 (七)
  4. vue - vue3与vue2.x的区别(一) :目录结构不一致
  5. 书籍推荐总结 C/C++/Java/Python/Linux/算法
  6. 解决GitLab Push master to origin/master was rejected by remote问题
  7. Python使用字体填充图片
  8. 【无人机】四轴无人机的轨迹进行可视化和动画处理(Matlab代码实现)
  9. Oracle11g安装,配置监听和数据库实例
  10. 浅谈javascript的事件监听——音乐播放器的控制