五十、Django中间件
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方法中,视图函数是最后执行的,靠前的先执行。
总结:
- 中间件的process_request方法是在执行视图函数之前执行的。
- 当配置多个中间件时,会按照列表的索引值,从上到下依次执行。
- 不同的中间件之间传递的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中间件相关推荐
- 利用django中间件CsrfViewMiddleware防止csrf攻击
一.在django后台处理 1.将django的setting中的加入django.contrib.messages.middleware.MessageMiddleware,一般新建的django项 ...
- Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)
摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...
- Django - 中间件
Django - 中间件 一. 什么是中间件 官方: 中间件是一个用来处理Django的请求和相应的框架级别的钩子, 他是一个轻量, 低级别的插件系统, 用于在全局范围内改变Django的输入和输出, ...
- django CBV装饰器 自定义django中间件 csrf跨站请求伪造 auth认证模块
CBV加装饰器 第一种 @method_decorator(装饰器) 加在get上 第二种 @method_decorator(login_auth,name='get') 加在类上 第三种 @met ...
- django view返回form error_Django(解决被钓鱼CSRF、Django中间件、反射)
今日内容概要 django中间件 全局用户身份校验 全局用户权限校验(补充) 全局访问频率校验 ... csrf跨站请求伪造 基于django中间件一个重要的编程思想(反射) https://www. ...
- Django中间件配合Vue拦截器的简单使用
axios拦截器是什么? axios拦截器可以拦截每一次的请求和响应,然后进行相应的处理.拦截器分为请求拦截器和响应拦截器,请求拦截器可以统一在你发送请求前在请求体里加上token:响应拦截器的话 ...
- Django—中间件详解
Django-中间件 中间件的定义 定义:中间件是django请求/响应处理的钩子框架,它是一个轻量级的.低级的插件系统,用于全局改变django的输入或输出 中间件以类的形式体现 每个中间件组件负责 ...
- Django-13:django中间件
Django-13:django中间件 django中间件 一.自定义中间件 1.1 步骤 1.2 process_request 1.3 process_response 1.3 其他 二.csrf ...
- Day 63 django 中间件、cookie、session
Day 63 django 中间件.cookie.session 文章目录 Day 63 django 中间件.cookie.session 1.cookie与session 简介 2.django操 ...
最新文章
- SpringMVC 多视图配置
- kafka实战最佳经验,【源码分析设计模式 10
- mysql压力测试并优化_MySQL压力测试索引优化效果演示全过程
- java实现ftp文件的上传与下载
- AT4437-[AGC028C]Min Cost Cycle【结论,堆】
- GIS工具篇(二):GIS最全数据下载指南
- android xml左边,Android XML – 如何将项目对齐到最左侧,中间和最右侧
- 一种简易的聊天泡泡设置颜色以及添加描边的方式
- 西北农林科技大学c语言上机题题答案,西北农林科技大学C语言上机实习4答案
- BraftEditor:插入图片删除后在服务器将图片同步删除
- 华科c语言作业,华中科技大学标准c语言程序设计及应用习题答案
- SAP MM物料管理系统功能详解
- ubuntu18.04安装nvidia驱动(戴尔G15_3060版本)
- word计算机板书,Word板书设计怎么写
- 非常好用的桌面壁纸更换软件
- python 将excel 数字日期转化为正常
- C++笔试面试题 从网上整理的,带答案
- android 按键 设置在哪,如何在Android设备上设置按键和按键?
- 10G整数文件中寻找中位数
- 电路板阻抗原理知识及应用