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程序与C程序的结合使用
Apr 07 Python
归纳整理Python中的控制流语句的知识点
Apr 14 Python
Python实现选择排序
Jun 04 Python
Pyqt实现无边框窗口拖动以及窗口大小改变
Apr 19 Python
python3 pandas 读取MySQL数据和插入的实例
Apr 20 Python
对Python中的@classmethod用法详解
Apr 21 Python
Python requests发送post请求的一些疑点
May 20 Python
python+flask实现API的方法
Nov 21 Python
pycharm配置当鼠标悬停时快速提示方法参数
Jul 31 Python
python实现两个文件夹的同步
Aug 29 Python
解决Keras TensorFlow 混编中 trainable=False设置无效问题
Jun 28 Python
基于Python和C++实现删除链表的节点
Jul 06 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仿博客园 个人博客(1) 数据库与界面设计
2013/07/05 PHP
PHP贪婪算法解决0-1背包问题实例分析
2015/03/23 PHP
PHP文件上传之多文件上传的实现思路
2016/01/27 PHP
php导出csv文件,可导出前导0实例代码
2016/11/16 PHP
枚举JavaScript对象的函数
2006/12/22 Javascript
动态控制Table的js代码
2007/03/07 Javascript
javascript 硬盘序列号+其它硬件信息
2008/12/23 Javascript
一个简单的jquery的多选下拉框(自写)
2014/05/05 Javascript
Javascript的setTimeout()使用闭包特性时需要注意的问题
2014/09/23 Javascript
2014年最火的Node.JS后端框架推荐
2014/10/27 Javascript
简介JavaScript中substring()方法的使用
2015/06/06 Javascript
JS学习之表格的排序简单实例
2016/05/16 Javascript
EasyUI加载完Html内容样式渲染完成后显示
2016/07/25 Javascript
jQuery元素属性操作实例(设置、获取及删除元素属性)
2016/09/08 Javascript
Javascript函数中的arguments.callee用法实例分析
2016/09/16 Javascript
Angularjs 设置全局变量的方法总结
2016/10/20 Javascript
JS html时钟制作代码分享
2017/03/03 Javascript
Express进阶之log4js实用入门指南
2018/02/10 Javascript
element-ui 限制日期选择的方法(datepicker)
2018/05/16 Javascript
微信小程序canvas绘制圆角base64图片的实现
2019/08/18 Javascript
讲解Python中的递归函数
2015/04/27 Python
python中快速进行多个字符替换的方法小结
2016/12/15 Python
django_orm查询性能优化方法
2018/08/20 Python
Django重置migrations文件的方法步骤
2019/05/01 Python
Python操作Mongodb数据库的方法小结
2019/09/10 Python
python matplotlib拟合直线的实现
2019/11/19 Python
python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据示例
2019/11/28 Python
使用pytorch实现可视化中间层的结果
2019/12/30 Python
使用HTML5的链接预取功能(link prefetching)给网站提速
2012/12/13 HTML / CSS
美国婚礼装饰和活动用品批发供应商:Event Decor Direct
2018/10/12 全球购物
爱尔兰旅游网站:ebookers.ie
2020/01/24 全球购物
会计专业应届生求职信
2013/11/24 职场文书
皮肤科医师岗位职责
2013/12/04 职场文书
教师学期末个人总结
2015/02/13 职场文书
详解Go语言中配置文件使用与日志配置
2022/06/01 Golang
Python实战实现爬取天气数据并完成可视化分析详解
2022/06/16 Python