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 相关文章推荐
Pyramid将models.py文件的内容分布到多个文件的方法
Nov 27 Python
python集合用法实例分析
May 30 Python
python脚本设置超时机制系统时间的方法
Feb 21 Python
Python实现简易Web爬虫详解
Jan 03 Python
python动态进度条的实现代码
Jul 03 Python
Python Pandas中根据列的值选取多行数据
Jul 08 Python
Python3中的最大整数和最大浮点数实例
Jul 09 Python
Python实现性能自动化测试竟然如此简单
Jul 30 Python
图文详解Django使用Pycharm连接MySQL数据库
Aug 09 Python
自定义Django Form中choicefield下拉菜单选取数据库内容实例
Mar 13 Python
python 中的命名空间,你真的了解吗?
Aug 19 Python
python 模拟登录B站的示例代码
Dec 15 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 json格式和js json格式 js跨域调用实现代码
2012/09/08 PHP
php pdo oracle中文乱码的快速解决方法
2016/05/16 PHP
利用 fsockopen() 函数开放端口扫描器的实例
2017/08/19 PHP
Laravel框架实现model层的增删改查(CURD)操作示例
2018/05/12 PHP
Jquery公告滚动+AJAX后台得到数据
2011/04/14 Javascript
jQuery 版元素拖拽原型代码
2011/04/25 Javascript
用表格输出1-1000之间的数字实现代码(附特效)
2013/04/21 Javascript
javascript dom追加内容实现示例
2013/09/21 Javascript
jQuery简单实现图片预加载
2015/04/20 Javascript
jquery实现的Banner广告收缩效果代码
2015/09/02 Javascript
详解jquery事件delegate()的使用方法
2016/01/25 Javascript
Bootstrap入门书籍之(零)Bootstrap简介
2016/02/17 Javascript
javascript面向对象程序设计高级特性经典教程(值得收藏)
2016/05/19 Javascript
jQuery 获取页面li数组并删除不在数组中的key
2016/08/02 Javascript
js 中获取制定的cook信息实现方法
2016/11/19 Javascript
react.js 翻页插件实例代码
2017/01/19 Javascript
vue父子模板传值问题解决方法案例分析
2020/02/26 Javascript
Python生成器(Generator)详解
2015/04/13 Python
[原创]使用豆瓣提供的国内pypi源
2017/07/02 Python
分享几道你可能遇到的python面试题
2017/07/24 Python
Python编程django实现同一个ip十分钟内只能注册一次
2017/11/03 Python
Python基于matplotlib实现绘制三维图形功能示例
2018/01/18 Python
Django中针对基于类的视图添加csrf_exempt实例代码
2018/02/11 Python
Flask模拟实现CSRF攻击的方法
2018/07/24 Python
Selenium chrome配置代理Python版的方法
2018/11/29 Python
python自动化测试之异常及日志操作实例分析
2019/11/09 Python
win10系统下python3安装及pip换源和使用教程
2020/01/06 Python
推荐8款常用的Python GUI图形界面开发框架
2020/02/23 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
2020/03/30 Python
Python 实现PS滤镜中的径向模糊特效
2020/12/03 Python
俄罗斯运动鞋商店:Sneakerhead
2018/05/10 全球购物
DNA基因检测和分析:23andMe
2019/05/01 全球购物
求职自荐信怎么写
2014/03/06 职场文书
文化与传播毕业生求职信
2014/03/09 职场文书
光棍节联谊晚会活动策划书
2014/10/10 职场文书
学校2016年全国助残日活动总结
2016/04/01 职场文书