中间件是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎使用,用不好会影响到性能.

Django默认的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',
]

自定义中间件

中间件一共有四个方法:

process_requestprocess_viewprocess_exceptionprocess_response

当用户发起请求的时候会一次经过所有的中间件,这个时候的请求是process_request,最后到达views的函数中,views函数处理后,再一次穿过中间件,这个时候是process_response,最后返回给请求者.

上述图中的中间件都是django中的,我们也可以自己定义一个中间件,自己写一个类,但是必须继承MiddlewareMixin

from django.utils.deprecation import MiddlewareMixin

自定义中间件

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponseclass Md1(MiddlewareMixin):def process_request(self,request):print("Md1请求")def process_response(self,request,response):print("Md1返回")return responseclass Md2(MiddlewareMixin):def process_request(self,request):print("Md2请求")#return HttpResponse("Md2中断")def process_response(self,request,response):print("Md2返回")    return response

结果:

Md1请求
Md2请求
view函数
Md2返回
Md1返回

如果当请求到达请求2的时候直接不符合条件返回,即return HttpResponse("Md2中断"),程序将把请求直接发给中间件2返回,然后依次返回到请求者,结果如下:

Md1请求
Md2请求
Md2返回
Md1返回

流程图如下:

如果修改为:

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponseclass Md1(MiddlewareMixin):def process_request(self,request):print("Md1请求")#return HttpResponse("Md1中断")def process_response(self,request,response):print("Md1返回")return responsedef process_view(self, request, callback, callback_args, callback_kwargs):print("Md1view")class Md2(MiddlewareMixin):def process_request(self,request):print("Md2请求")return HttpResponse("Md2中断")def process_response(self,request,response):print("Md2返回")return responsedef process_view(self, request, callback, callback_args, callback_kwargs):print("Md2view")

结果如下:

Md1请求
Md2请求
Md1view
Md2view
view函数
Md2返回
Md1返回

当最后一个中间的process_request到达路由关系映射之后,返回到中间件1的process_view,然后依次往下,到达view函数,最后通过process_response依次返回到达用户.

process_view可以用来调用视图函数

process_exception

process_exception(self, request, exception)

示例修改如下:

class Md1(MiddlewareMixin):def process_request(self,request):print("Md1请求")#return HttpResponse("Md1中断")def process_response(self,request,response):print("Md1返回")return responsedef process_view(self, request, callback, callback_args, callback_kwargs):# return HttpResponse("hello")# response=callback(request,*callback_args,**callback_kwargs)# return responseprint("md1 process_view...")def process_exception(self):print("md1 process_exception...")class Md2(MiddlewareMixin):def process_request(self,request):print("Md2请求")# return HttpResponse("Md2中断")def process_response(self,request,response):print("Md2返回")return responsedef process_view(self, request, callback, callback_args, callback_kwargs):print("md2 process_view...")def process_exception(self):print("md1 process_exception...")

结果如下:

Md1请求
Md2请求
md1 process_view...
md2 process_view...
view函数...Md2返回
Md1返回

当views出现错误时:

将Md2的process_exception修改如下:

def process_exception(self, request, exception):print("md2 process_exception...")return HttpResponse("error")

结果如下:

Md1请求
Md2请求
md1 process_view...
md2 process_view...
view函数...
md2 process_exception...
Md2返回
Md1返回

转载于:https://www.cnblogs.com/s593941/p/10012048.html

Django组件-中间件相关推荐

  1. Django 组件- 中间件

    11.1 中间件 一.中间件的概念 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨 ...

  2. 07 Django组件-中间件

    中间件 方式一:函数式:中间件[middleware],也叫钩子方法[钩子函数],hook Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Djang ...

  3. 浅谈Django的中间件与Python的装饰器

    浅谈Django的中间件 与Python的装饰器 一.原理 1.装饰器是Python的一种语法应用,利用闭包的原理去更改一个函数的功能,即让一个函数执行之前先到另外一个函数中执行其他需求语句,在执行该 ...

  4. Django的中间件

    Django的中间件 目录 中间件介绍 什么是中间件? 自定义中间件 自定义一个中间件示例 process_request process_response process_view process_ ...

  5. 13 Django之中间件

    一.什么是中间件 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影 ...

  6. python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)...

    python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页) 一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 fro ...

  7. django框架--中间件系统

    目录 零.参考 一.中间件的基本理解 二.中间件的系统定位 三.中间件的配置 四.中间件的执行流程 五.中间件与装饰器之间的思考 六.中间件的应用场景 七.内置中间件 八.总结 零.参考 https: ...

  8. 使用模式创建一个面向服务的组件中间件

    引言 在本文中,您将了解面向服务的组件中间件在用于资源有限的语音设备时,在设计阶段所应用的模式.它涵盖了项目的问题上下文,并被看成是一组决定因素,是对相关体系结构远景的一个简要概括.您还会得到一份描述 ...

  9. Django之中间件,csrf跨站伪造请求,auth认证模块

    Django请求生命周期 django的中间件 django的中间件相当于保安,请求的时候要经过django的中间件才能连接django的后端 能用来干什么:能够做网站的全局身份认证,访问频率,权限认 ...

最新文章

  1. 面试题05-UI控件
  2. 性能优化18招提速宝典
  3. Remoting简介
  4. php http 类,php写的http请求封装类
  5. 4G内存为什么会少800M
  6. js中WINDOW对象中的location成员对象
  7. python opencv录制视频_Python-OpenCV 处理视频(一)(二): 输入输出 视频处理
  8. 【路径规划】局部路径规划算法——人工势场法(含python实现)
  9. 索尼Z2强刷固件教程
  10. plsql 登录提示 丢失msvcr71.dll
  11. 【电脑突然识别不了外置光驱】
  12. 快速读懂CAN报文 DBC文件 解析文件
  13. 计算机毕业设计Python毕业论文总结基于Python实现的仓库库存管理系统[包运行成功]
  14. 我们把计算机硬件系统和软件系统称为,中国大学MOOC:\我们把计算机硬件系统和软件系统总称为( )。\;...
  15. CentOS7自动发送邮件配置
  16. thinkphp 运行机制和优缺点
  17. 【用户投稿】优麒麟社区懒人版本(含软件全家桶)一键安装
  18. 如何修改非root用户的ulimit -n的值
  19. Scrapy框架爬虫项目:京东商城笔记本电脑信息爬取
  20. Epicor BPM - 在VS中编写BPM代码

热门文章

  1. BZOJ2705 [SDOI2012]Longge的问题 欧拉函数
  2. securecrt鼠标右键的配置
  3. ios网络学习------4 UIWebView的加载本地数据的三种方式
  4. 深入理解JVM—性能调优
  5. 如何用DELPHI实现把WORD、EXCEL和图片等存储到数据库中
  6. STC89C52 STC89LE52 NRF24L01无线 教程 (二)
  7. 11.15 dmidecode:查询系统硬件信息
  8. linux mysql timestamp_MYSQL中TIMESTAMP类型的使用
  9. 移动端 c++ 开发_这 10 点值得移动端开发重点学习
  10. 云栖首日:智物智造宣布3年10亿目标