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 相关文章推荐
使用go和python递归删除.ds store文件的方法
Jan 22 Python
python实现逆波兰计算表达式实例详解
May 06 Python
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
Jul 11 Python
基于Python实现定时自动给微信好友发送天气预报
Oct 25 Python
解决python3 pika之连接断开的问题
Dec 18 Python
python自动化测试之DDT数据驱动的实现代码
Jul 23 Python
Python实现一个带权无回置随机抽选函数的方法
Jul 24 Python
Django 实现前端图片压缩功能的方法
Aug 07 Python
python区分不同数据类型的方法
Oct 14 Python
python实现差分隐私Laplace机制详解
Nov 25 Python
Python3之外部文件调用Django程序操作model等文件实现方式
Apr 07 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
PHP similar_text 字符串的相似性比较函数
2010/05/26 PHP
PHP中::、->、self、$this几种操作符的区别介绍
2013/04/24 PHP
php预定义变量使用帮助(带实例)
2013/10/30 PHP
PHP imagegrabscreen和imagegrabwindow(截取网站缩略图)的实例代码
2013/11/07 PHP
PHP生成二维码的两个方法和实例
2014/07/01 PHP
php 实现一个字符串加密解密的函数实例代码
2016/11/01 PHP
PHP+百度AI OCR文字识别实现了图片的文字识别功能
2019/05/08 PHP
List the Codec Files on a Computer
2007/06/18 Javascript
JavaScript中的变量作用域介绍
2014/12/31 Javascript
js判断手机端(Android手机还是iPhone手机)
2015/07/22 Javascript
js实现的二级横向菜单条实例
2015/08/22 Javascript
jQuery实现弹出带遮罩层的居中浮动窗口效果
2016/09/12 Javascript
浅谈js控制li标签排序问题 js调用php函数的方法
2016/10/16 Javascript
Angular 2 ngForm中的ngModel、[ngModel]和[(ngModel)]的写法
2017/06/29 Javascript
使用JavaScript进行表单校验功能
2017/08/01 Javascript
js实现把时间戳转换为yyyy-MM-dd hh:mm 格式(es6语法)
2017/12/28 Javascript
JavaScript遍历数组和对象的元素简单操作示例
2019/07/09 Javascript
node.js中 mysql 增删改查操作及async,await处理实例分析
2020/02/11 Javascript
浅析VUE防抖与节流
2020/11/24 Vue.js
Python实现读取机器硬件信息的方法示例
2018/06/09 Python
Python基于机器学习方法实现的电影推荐系统实例详解
2019/06/25 Python
python IDLE 背景以及字体大小的修改方法
2019/07/12 Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
2019/12/09 Python
Django基于客户端下载文件实现方法
2020/04/21 Python
python--shutil移动文件到另一个路径的操作
2020/07/13 Python
HTML5页面中尝试调起APP功能
2017/09/12 HTML / CSS
环法自行车赛官方商店:Le Tour de France
2017/08/27 全球购物
理财投资建议书
2014/03/12 职场文书
私人房屋买卖协议书
2014/10/04 职场文书
流动人口婚育证明
2014/10/19 职场文书
法律讲堂观后感
2015/06/11 职场文书
干部考核工作总结2015
2015/07/24 职场文书
新入职员工工作总结
2015/10/15 职场文书
读后感怎么写?书写读后感的基本技巧!
2019/12/10 职场文书
聊聊基于pytorch实现Resnet对本地数据集的训练问题
2022/03/25 Python
使用Python解决图表与画布的间距问题
2022/04/11 Python