Django框架教程之中间件MiddleWare浅析


Posted in Python onDecember 29, 2019

前言

Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。
中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。

我们可以使用中间件,在Django处理视图的不同阶段对输入或输出进行干预。

中间件的原理其实就是定义了一个装饰器,但是这个装饰器可以对整个项目中的所有方法进行装饰;

我们可以通过中间件,对请求对象和响应对象进行相应的干预操作。

实现中间件的流程:

1.在子应用中编写一个middleware.py的文件

def my_middleware(get_response):
 print('中间件初始化')
 def middlewraer(request, *args, **kwargs):
  print('在执行执行前对请求进行干预')
  # 加入干预代码, 主要应用白名单黑名单
  if request.META['USER'] == 'KG':
   return HttpResponse('该用户无法访问')
  ret = get_response(request, *args,**kwargs)
  print('在执行后对响应进行干预')
  return ret
 return middlewrae

2. 在setting文件中注册中间件

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',
 # 注册中间件
 'users.middleware.my_middleware', 
]

注意:Django运行在调试模式下,中间件init部分有可能被调用两次。

多个中间件执行流程:

1. 中间件会将setting文件中的MIDDLEWARE列表进行逆序,所以初始化的顺序时从下向上的;

2. 在调用时,即编写顺序上第一个中间件装饰的是编写顺序上的第二个中间件,而编写顺序上的第二个中间件装饰的才是视图函数;

3. 在调用结束返回时,会先将视图函数的结果返回给编写顺序上的第二个中间件,然后再返回给编写顺序上的第一个中间件。

代码解读:

@decorator1
@decorator2
def index(View): 
 pass

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python访问系统环境变量的方法
Apr 29 Python
Python中zfill()方法的使用教程
May 20 Python
Python语言实现获取主机名根据端口杀死进程
Mar 31 Python
简单了解Django模板的使用
Dec 20 Python
python+pandas生成指定日期和重采样的方法
Apr 11 Python
对python中GUI,Label和Button的实例详解
Jun 27 Python
简单了解Python3 bytes和str类型的区别和联系
Dec 19 Python
浅析Python3 pip换源问题
Jan 06 Python
numpy库ndarray多维数组的维度变换方法(reshape、resize、swapaxes、flatten)
Apr 28 Python
如何使用pycharm连接Databricks的步骤详解
Sep 23 Python
Django使用channels + websocket打造在线聊天室
May 20 Python
解决Python字典查找报Keyerror的问题
May 26 Python
三个python爬虫项目实例代码
Dec 28 #Python
python scrapy重复执行实现代码详解
Dec 28 #Python
Python统计时间内的并发数代码实例
Dec 28 #Python
如何基于python实现脚本加密
Dec 28 #Python
python使用配置文件过程详解
Dec 28 #Python
python正则表达式匹配IP代码实例
Dec 28 #Python
python爬虫模拟浏览器访问-User-Agent过程解析
Dec 28 #Python
You might like
PHP中Memcache操作类及用法实例
2014/12/12 PHP
codeigniter发送邮件并打印调试信息的方法
2015/03/21 PHP
PHP7.0版本备注
2015/07/23 PHP
Smarty实现页面静态化(生成HTML)的方法
2016/05/23 PHP
PDO的安全处理与事物处理方法
2016/10/31 PHP
thinkPHP利用ajax异步上传图片并显示、删除的示例
2018/09/26 PHP
php把文件设置为插件的技巧方法
2020/02/03 PHP
Javascript----文件操作
2007/01/18 Javascript
复制本贴标题和地址的js代码
2008/07/01 Javascript
Firefox+FireBug使JQuery的学习更加轻松愉快
2010/01/01 Javascript
在一个js文件里远程调用jquery.js会在ie8下的一个奇怪问题
2010/11/28 Javascript
parentElement,srcElement的使用小结
2014/01/13 Javascript
javascript面向对象之共享成员属性与方法及prototype关键字用法
2015/01/13 Javascript
javascript类型系统——日期Date对象全面了解
2016/07/13 Javascript
原生态js,鼠标按下后,经过了那些单元格的简单实例
2016/08/11 Javascript
canvas实现图片根据滑块放大缩小效果
2017/02/24 Javascript
vue-router 导航钩子的具体使用方法
2017/08/31 Javascript
浅谈JavaScript中的属性:如何遍历属性
2017/09/14 Javascript
Vue.directive()的用法和实例详解
2018/03/04 Javascript
element-ui表格列金额显示两位小数的方法
2018/08/24 Javascript
详解微信小程序之scroll-view的flex布局问题
2019/01/16 Javascript
JavaScript中的this/call/apply/bind的使用及区别
2020/03/06 Javascript
[03:00]2014DOTA2国际邀请赛 Titan淘汰潸然泪下Ohaiyo专访
2014/07/15 DOTA
详解Python使用tensorflow入门指南
2018/02/09 Python
浅谈Scrapy网络爬虫框架的工作原理和数据采集
2019/02/07 Python
Python使用sqlite3模块内置数据库
2020/05/07 Python
Python日志处理模块logging用法解析
2020/05/19 Python
Python使用shutil模块实现文件拷贝
2020/07/31 Python
NFL Game Pass欧洲:在线观看NFL比赛直播和点播,以高清质量播放
2018/08/30 全球购物
巴西Bo.Bô官方在线商店:经营奢侈品时尚业务
2020/03/16 全球购物
观看《永远的雷锋》心得体会
2014/03/12 职场文书
卖房协议书
2014/04/11 职场文书
经营理念标语
2014/06/21 职场文书
社区服务标语
2014/07/01 职场文书
代收款委托书范本
2014/10/01 职场文书
幼儿园教师节活动总结
2015/03/23 职场文书