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数组复制拷贝的实现方法
Jun 09 Python
Python打包可执行文件的方法详解
Sep 19 Python
TensorFlow平台下Python实现神经网络
Mar 10 Python
详解基于django实现的webssh简单例子
Jul 17 Python
Python使用一行代码获取上个月是几月
Aug 30 Python
python进程间通信Queue工作过程详解
Nov 01 Python
Python的pygame安装教程详解
Feb 10 Python
python模拟哔哩哔哩滑块登入验证的实现
Apr 24 Python
python实现从ftp上下载文件的实例方法
Jul 19 Python
Python 如何展开嵌套的序列
Aug 01 Python
关于Python3的import问题(pycharm可以运行命令行import错误)
Nov 18 Python
基于python制作简易版学生信息管理系统
Apr 20 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实现分页的一个示例
2006/10/09 PHP
PHP查询网站的PR值
2013/10/30 PHP
php实现分页工具类分享
2014/01/09 PHP
php去掉URL网址中带有PHPSESSID的配置方法
2014/07/08 PHP
CodeIgniter 完美解决URL含有中文字符串
2016/05/13 PHP
CentOS7.0下安装PHP5.6.30服务的教程详解
2018/09/29 PHP
你可能不再需要JQUERY
2021/03/09 Javascript
用javascript动态调整iframe高度的代码
2007/04/10 Javascript
IE6下js通过css隐藏select的一个bug
2010/08/16 Javascript
JavaScript高级程序设计(第3版)学习笔记11 内建js对象
2012/10/11 Javascript
JQuery Highcharts 动态生成图表的方法
2013/11/15 Javascript
jQuery实现指定内容滚动同时左侧或其它地方不滚动的方法
2015/08/08 Javascript
JavaScript如何实现组合列表框中元素移动效果
2016/03/01 Javascript
js验证框架之RealyEasy验证详解
2016/06/08 Javascript
Vue中的数据监听和数据交互案例解析
2017/07/12 Javascript
详解React Native开源时间日期选择器组件(react-native-datetime)
2017/09/13 Javascript
Angular4 反向代理Details实践
2018/05/30 Javascript
利用JavaScript的Map提升性能的方法详解
2019/08/14 Javascript
[01:37]DOTA2超级联赛专访ChuaN 传奇般的电竞之路
2013/06/19 DOTA
[01:57]2018DOTA2亚洲邀请赛赛前采访-iG
2018/04/03 DOTA
python进阶教程之模块(module)介绍
2014/08/30 Python
浅谈终端直接执行py文件,不需要python命令
2017/01/23 Python
python cx_Oracle模块的安装和使用详细介绍
2017/02/13 Python
Python中协程用法代码详解
2018/02/10 Python
浅谈python中np.array的shape( ,)与( ,1)的区别
2018/06/04 Python
Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法
2019/08/26 Python
Python中的 ansible 动态Inventory 脚本
2020/01/19 Python
在Tensorflow中实现梯度下降法更新参数值
2020/01/23 Python
解决python图像处理图像赋值后变为白色的问题
2020/06/04 Python
如何用canvas实现在线签名的示例代码
2018/07/10 HTML / CSS
THE OUTNET美国官网:国际设计师品牌折扣网站
2017/03/07 全球购物
什么是用户模式(User Mode)与内核模式(Kernel Mode) ?
2015/09/07 面试题
测试驱动开发的主要步骤是什么
2014/12/10 面试题
小学国旗下的演讲稿
2014/08/28 职场文书
涨价通知怎么写
2015/04/23 职场文书
2015年党员创先争优公开承诺书
2015/04/27 职场文书