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修改MP3文件的方法
Jun 15 Python
Python实现多进程共享数据的方法分析
Dec 04 Python
Python通过Pygame绘制移动的矩形实例代码
Jan 03 Python
python中文编码与json中文输出问题详解
Aug 24 Python
CentOS下Python3的安装及创建虚拟环境的方法
Nov 28 Python
numpy linalg模块的具体使用方法
May 26 Python
python通用读取vcf文件的类(复制粘贴即可用)
Feb 29 Python
Python sorted排序方法如何实现
Mar 31 Python
使用python实现名片管理系统
Jun 18 Python
通俗讲解python 装饰器
Sep 07 Python
Python爬虫之Selenium实现窗口截图
Dec 04 Python
VSCode中autopep8无法运行问题解决方案(提示Error: Command failed,usage)
Mar 02 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
iis下php mail函数的sendmail配置方法(官方推荐)
2012/04/25 PHP
php实现HTML实体编号与非ASCII字符串相互转换类实例
2016/11/02 PHP
Yii使用DbTarget实现日志功能的示例代码
2020/07/21 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
20个非常棒的Jquery实用工具 国外文章
2010/01/01 Javascript
js 巧妙去除数组中的重复项
2010/01/25 Javascript
jQuery源码分析-03构造jQuery对象-源码结构和核心函数
2011/11/14 Javascript
jquery插件冲突(jquery.noconflict)解决方法分享
2014/03/20 Javascript
jQuery实现防止提交按钮被双击的方法
2015/03/24 Javascript
解决angular的post请求后SpringMVC后台接收不到参数值问题的方法
2015/12/10 Javascript
Position属性之relative用法
2015/12/14 Javascript
js获取元素下的第一级子元素的方法(推荐)
2017/03/05 Javascript
JS实现颜色动态淡化效果
2017/03/06 Javascript
微信小程序使用Vant Weapp组件库的方法步骤
2019/08/01 Javascript
webpack+vue-cil 中proxyTable配置接口地址代理操作
2020/07/18 Javascript
使用原生javascript开发计算器实例代码
2021/02/21 Javascript
[03:57]《不朽》——2015DOTA2国际邀请赛—中国军团出征主题曲MV
2015/07/15 DOTA
Python数组条件过滤filter函数使用示例
2014/07/22 Python
python使用socket创建tcp服务器和客户端
2018/04/12 Python
一行python实现树形结构的方法
2019/08/09 Python
使用pyqt 实现重复打开多个相同界面
2019/12/13 Python
Python 私有属性和私有方法应用场景分析
2020/06/19 Python
Python 实现集合Set的示例
2020/12/21 Python
意大利奢侈品购物网站:Giglio
2018/01/05 全球购物
如何写出好的Java代码
2014/04/25 面试题
施工安全协议书
2013/12/11 职场文书
历史系自荐信范文
2013/12/24 职场文书
2014年学校国庆主题活动方案
2014/09/16 职场文书
2014年教学管理工作总结
2014/12/02 职场文书
餐饮服务员岗位职责
2015/02/09 职场文书
2015年幼儿园班务工作总结
2015/05/12 职场文书
物业保安辞职信
2015/05/12 职场文书
毕业生学校组织意见
2015/06/04 职场文书
2016教师党员学习心得体会
2016/01/21 职场文书
go语言中切片与内存复制 memcpy 的实现操作
2021/04/27 Golang
浅析Python实现DFA算法
2021/06/26 Python