Django组件-中间件
中间件是介于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组件-中间件相关推荐
- Django 组件- 中间件
11.1 中间件 一.中间件的概念 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨 ...
- 07 Django组件-中间件
中间件 方式一:函数式:中间件[middleware],也叫钩子方法[钩子函数],hook Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Djang ...
- 浅谈Django的中间件与Python的装饰器
浅谈Django的中间件 与Python的装饰器 一.原理 1.装饰器是Python的一种语法应用,利用闭包的原理去更改一个函数的功能,即让一个函数执行之前先到另外一个函数中执行其他需求语句,在执行该 ...
- Django的中间件
Django的中间件 目录 中间件介绍 什么是中间件? 自定义中间件 自定义一个中间件示例 process_request process_response process_view process_ ...
- 13 Django之中间件
一.什么是中间件 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影 ...
- python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)...
python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页) 一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 fro ...
- django框架--中间件系统
目录 零.参考 一.中间件的基本理解 二.中间件的系统定位 三.中间件的配置 四.中间件的执行流程 五.中间件与装饰器之间的思考 六.中间件的应用场景 七.内置中间件 八.总结 零.参考 https: ...
- 使用模式创建一个面向服务的组件中间件
引言 在本文中,您将了解面向服务的组件中间件在用于资源有限的语音设备时,在设计阶段所应用的模式.它涵盖了项目的问题上下文,并被看成是一组决定因素,是对相关体系结构远景的一个简要概括.您还会得到一份描述 ...
- Django之中间件,csrf跨站伪造请求,auth认证模块
Django请求生命周期 django的中间件 django的中间件相当于保安,请求的时候要经过django的中间件才能连接django的后端 能用来干什么:能够做网站的全局身份认证,访问频率,权限认 ...
最新文章
- 面试题05-UI控件
- 性能优化18招提速宝典
- Remoting简介
- php http 类,php写的http请求封装类
- 4G内存为什么会少800M
- js中WINDOW对象中的location成员对象
- python opencv录制视频_Python-OpenCV 处理视频(一)(二): 输入输出 视频处理
- 【路径规划】局部路径规划算法——人工势场法(含python实现)
- 索尼Z2强刷固件教程
- plsql 登录提示 丢失msvcr71.dll
- 【电脑突然识别不了外置光驱】
- 快速读懂CAN报文 DBC文件 解析文件
- 计算机毕业设计Python毕业论文总结基于Python实现的仓库库存管理系统[包运行成功]
- 我们把计算机硬件系统和软件系统称为,中国大学MOOC:\我们把计算机硬件系统和软件系统总称为( )。\;...
- CentOS7自动发送邮件配置
- thinkphp 运行机制和优缺点
- 【用户投稿】优麒麟社区懒人版本(含软件全家桶)一键安装
- 如何修改非root用户的ulimit -n的值
- Scrapy框架爬虫项目:京东商城笔记本电脑信息爬取
- Epicor BPM - 在VS中编写BPM代码
热门文章
- BZOJ2705 [SDOI2012]Longge的问题 欧拉函数
- securecrt鼠标右键的配置
- ios网络学习------4 UIWebView的加载本地数据的三种方式
- 深入理解JVM—性能调优
- 如何用DELPHI实现把WORD、EXCEL和图片等存储到数据库中
- STC89C52 STC89LE52 NRF24L01无线 教程 (二)
- 11.15 dmidecode:查询系统硬件信息
- linux mysql timestamp_MYSQL中TIMESTAMP类型的使用
- 移动端 c++ 开发_这 10 点值得移动端开发重点学习
- 云栖首日:智物智造宣布3年10亿目标