Django中间件

  • 一 中间件简介
  • 二 编写自己的中间件
  • 三 中间件执行流程

一 中间件简介

中间件是Django请求/响应处理的钩子函数。它是一个轻量级的、低级的"插件系统",用于全局改变Django的输入和输出。中间件是帮助我们在视图函数执行之前都可以做一些额外的操作,它本质就是一个自定义类,类中定义几个方法,Djago框架会在特定的时候自动触发。

每个中间件负责做一些特定的功能。例如,‘django.contrib.auth.middleware.AuthenticationMiddleware’,它是用来将用户与请求关联起来。

二 编写自己的中间件

中间件工厂是一个可调用的程序,它接受请求并返回响应。
中间件可以定义五个方法,分别是:

  • process_request(self, request)
  • process_response(self, request, response)
  • process_view(self, request, view_func, view_args, view_kwargs)
  • process_template_response(self,request,response)
  • process_exception(self, request, exception)
from django.utils.deprecation import MiddlewareMixinclass M1(MiddlewareMixin):def process_request(self, request):print('来自M1 process_request')class M2(MiddlewareMixin):def process_request(self, request):print('来自M2 process_request')
from django.utils.deprecation import MiddlewareMixinclass M1(MiddlewareMixin):def process_request(self, request):print('来自M1 process_request')def process_response(self, request, response):print('来自M1 process_response')return responseclass M2(MiddlewareMixin):def process_request(self, request):print('来自M2 process_request')def process_response(self, request, response):print('来自M2 process_response')return response

process_resquest
需要一个参数request,它的返回值可以是None,也可以是HttpResponse对象,如果返回None,就继续向下走,返回HttpResponse对象就不执行视图函数直接将对象返回给浏览器。

在process_request方法中,视图函数是最后执行的,靠前的先执行。

总结:

  1. 中间件的process_request方法是在执行视图函数之前执行的。
  2. 当配置多个中间件时,会按照列表的索引值,从上到下依次执行。
  3. 不同的中间件之间传递的request是同一个对象。

process_response
在执行完视图函数之后才执行,执行顺序和process_request方法相反,从下往上依次执行。

定义process_response方法时,需要传参request和response,response是视图函数返回的HttpResponse对象,如果返回一个自己定义的HttpResponse对象,浏览器接收到的也是自定义的而不是后端处理的。

process_view
process_view(self, request, view_func, view_args, view_kwargs)

该方法有四个参数
request是HttpRequest对象。
view_func是Django即将使用的视图函数。 (它是实际的函数对象,而不是函数的名称作为字符串。)
view_args是将传递给视图的位置参数的列表.
view_kwargs是将传递给视图的关键字参数的字典。 view_args和view_kwargs都不包含第一个视图参数(request)。

Django会在调用视图函数之前调用此方法,返回None或者HttpResponse对象,如果返回None,Django将继续处理这个请求,执行其他中间件的process_view方法,然后执行视图函数。如果返回HttpResponse对象,那么就不执行视图函数,而是直接掉头,执行process_response方法返回给浏览器。

process_view方法是在Django路由系统之后,视图系统之前执行的,执行顺序按照MIDDLEWARE中的注册顺序从前到后顺序执行的。

process_exception
process_exception(self, request, exception)
该方法两个参数:

一个HttpRequest对象

一个exception是视图函数异常产生的Exception对象。

这个方法只有在视图函数中出现异常了才执行,它返回的值可以是一个None也可以是一个HttpResponse对象。如果是HttpResponse对象,Django将调用模板和中间件中的process_response方法,并返回给浏览器,否则将默认处理异常。如果返回一个None,则交给下一个中间件的process_exception方法来处理异常。它的执行顺序也是按照中间件注册顺序的倒序执行。

process_template_response
process_template_response(self, request, response)

它的参数,一个HttpRequest对象,response是TemplateResponse对象(由视图函数或者中间件产生)。

process_template_response是在视图函数执行完成后立即执行,但是它有一个前提条件,那就是视图函数返回的对象有一个render()方法(或者表明该对象是一个TemplateResponse对象或等价方法)。

三 中间件执行流程

当有请求来时,先按照前后顺序依次执行process_request()方法,process_request如果返回None,就往下执行,如果返回一个HttpResponse对象就不执行process_request,而是执行当前层级的process_response方法,依次向上执行,返回给浏览器。例如下图中在中间件3返回了HttpResponse对象,就执行中间件3的process_response,依次往上返回给浏览器。下面的process_request,process_response都不会执行。

process_request方法都执行完,找到对应的视图函数,先不执行视图函数,而是执行中间件中的process_view方法,process_view返回None就继续依次执行,所有的process_view执行完才执行视图函数。下图中的中间件3返回了HttpResponse对象,下面的process_view方法就不执行了,直接执行最下边的process_response方法,依次向上返回给浏览器。

process_template_response和process_exception两个方法的触发是有条件的,执行顺序也是倒序。

五十、Django中间件相关推荐

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

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

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

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

  3. Django - 中间件

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

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

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

  5. django view返回form error_Django(解决被钓鱼CSRF、Django中间件、反射)

    今日内容概要 django中间件 全局用户身份校验 全局用户权限校验(补充) 全局访问频率校验 ... csrf跨站请求伪造 基于django中间件一个重要的编程思想(反射) https://www. ...

  6. Django中间件配合Vue拦截器的简单使用

    axios拦截器是什么?   axios拦截器可以拦截每一次的请求和响应,然后进行相应的处理.拦截器分为请求拦截器和响应拦截器,请求拦截器可以统一在你发送请求前在请求体里加上token:响应拦截器的话 ...

  7. Django—中间件详解

    Django-中间件 中间件的定义 定义:中间件是django请求/响应处理的钩子框架,它是一个轻量级的.低级的插件系统,用于全局改变django的输入或输出 中间件以类的形式体现 每个中间件组件负责 ...

  8. Django-13:django中间件

    Django-13:django中间件 django中间件 一.自定义中间件 1.1 步骤 1.2 process_request 1.3 process_response 1.3 其他 二.csrf ...

  9. Day 63 django 中间件、cookie、session

    Day 63 django 中间件.cookie.session 文章目录 Day 63 django 中间件.cookie.session 1.cookie与session 简介 2.django操 ...

最新文章

  1. SpringMVC 多视图配置
  2. kafka实战最佳经验,【源码分析设计模式 10
  3. mysql压力测试并优化_MySQL压力测试索引优化效果演示全过程
  4. java实现ftp文件的上传与下载
  5. AT4437-[AGC028C]Min Cost Cycle【结论,堆】
  6. GIS工具篇(二):GIS最全数据下载指南
  7. android xml左边,Android XML – 如何将项目对齐到最左侧,中间和最右侧
  8. 一种简易的聊天泡泡设置颜色以及添加描边的方式
  9. 西北农林科技大学c语言上机题题答案,西北农林科技大学C语言上机实习4答案
  10. BraftEditor:插入图片删除后在服务器将图片同步删除
  11. 华科c语言作业,华中科技大学标准c语言程序设计及应用习题答案
  12. SAP MM物料管理系统功能详解
  13. ubuntu18.04安装nvidia驱动(戴尔G15_3060版本)
  14. word计算机板书,Word板书设计怎么写
  15. 非常好用的桌面壁纸更换软件
  16. python 将excel 数字日期转化为正常
  17. C++笔试面试题 从网上整理的,带答案
  18. android 按键 设置在哪,如何在Android设备上设置按键和按键?
  19. 10G整数文件中寻找中位数
  20. 电路板阻抗原理知识及应用

热门文章

  1. Python计时工具
  2. 报错src unsupport width stride 300,rgb888 width stride should be 16 aligned(已解决)
  3. 电场与磁场中的物理量
  4. 凯文・凯利-《失控》
  5. 2020年全国水资源总量、总供水量、总用水量及人均综合用水量分析[图]
  6. 宏替换、条件编译、头文件展开
  7. 微信公众号下载神器—WeChatDownload
  8. Android 开源热库汇总(二):快速开发库
  9. 大国重器 | 以北斗卫星可视化,致敬伟大祖国
  10. 搭建影音系统APP低价格靠谱吗?