Django框架之中间件MiddleWare的实现


Posted in Python onDecember 30, 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书单 不将就
Jul 11 Python
python自动化脚本安装指定版本python环境详解
Sep 14 Python
详解python OpenCV学习笔记之直方图均衡化
Feb 08 Python
解决使用PyCharm时无法启动控制台的问题
Jan 19 Python
python之mock模块基本使用方法详解
Jun 27 Python
python shutil文件操作工具使用实例分析
Dec 25 Python
tensorflow 模型权重导出实例
Jan 24 Python
解决在keras中使用model.save()函数保存模型失败的问题
May 21 Python
pytorch掉坑记录:model.eval的作用说明
Jun 23 Python
使用numpngw和matplotlib生成png动画的示例代码
Jan 24 Python
关于python类SortedList详解
Sep 04 Python
python热力图实现的完整实例
Jun 25 Python
Django 路由层URLconf的实现
Dec 30 #Python
python解析多层json操作示例
Dec 30 #Python
pytorch 求网络模型参数实例
Dec 30 #Python
利用python3 的pygame模块实现塔防游戏
Dec 30 #Python
pytorch 批次遍历数据集打印数据的例子
Dec 30 #Python
python多线程使用方法实例详解
Dec 30 #Python
Python动态声明变量赋值代码实例
Dec 30 #Python
You might like
第十五节--Zend引擎的发展
2006/11/16 PHP
php绘制一条直线的方法
2015/01/24 PHP
PHP解压tar.gz格式文件的方法
2016/02/14 PHP
PHP压缩图片功能的介绍
2019/03/21 PHP
基于thinkphp5框架实现微信小程序支付 退款 订单查询 退款查询操作
2020/08/17 PHP
XML+XSL 与 HTML 两种方案的结合
2007/04/22 Javascript
得到jQuery detach()后节点中的某个值实现代码
2013/02/05 Javascript
jquery中get,post和ajax方法的使用小结
2014/02/04 Javascript
js中文逗号转英文实现
2014/02/11 Javascript
js获取url中的参数且参数为中文时通过js解码
2014/03/19 Javascript
Jquery树插件zTree用法入门教程
2015/02/17 Javascript
javascript如何操作HTML下拉列表标签
2015/08/20 Javascript
javascript中return,return true,return false三者的用法及区别
2015/11/17 Javascript
jQuery添加删除DOM元素方法详解
2016/01/18 Javascript
jQuery侧边栏实现代码
2016/05/06 Javascript
原生javascript实现分享到朋友圈功能 支持ios和android
2016/05/11 Javascript
修改Jquery Dialog 位置的实现方法
2016/08/26 Javascript
JS实现给对象动态添加属性的方法
2017/01/05 Javascript
three.js实现3D影院的原理的代码分析
2017/12/18 Javascript
jQuery+ajax读取json数据并按照价格排序示例
2018/03/28 jQuery
JS绘图Flot应用图形绘制异常解决方案
2020/10/16 Javascript
[54:54]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
[49:08]Secret vs VP 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python lxml模块安装教程
2015/06/02 Python
python结合shell查询google关键词排名的实现代码
2016/02/27 Python
Python标准库之itertools库的使用方法
2017/09/07 Python
python GUI模拟实现计算器
2020/06/22 Python
LookFantastic丹麦:英国美容护肤精品在线商城
2016/08/18 全球购物
巴西24小时在线药房:Drogasil
2020/06/20 全球购物
Unix如何在一行中运行多个命令
2015/05/29 面试题
市场营销个人求职信范文
2014/02/02 职场文书
项目经理任命书
2014/06/04 职场文书
酒店圣诞节活动总结
2015/05/06 职场文书
浅谈redis缓存在项目中的使用
2021/05/20 Redis
python 详解turtle画爱心代码
2022/02/15 Python
TypeScript 内置高级类型编程示例
2022/09/23 Javascript