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中的错误和异常处理简单操作示例【try-except用法】
Jul 25 Python
一个Python最简单的接口自动化框架
Jan 02 Python
Python编程中NotImplementedError的使用方法
Apr 21 Python
python pandas中对Series数据进行轴向连接的实例
Jun 08 Python
python对html过滤处理的方法
Oct 21 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
Nov 06 Python
python3 打开外部程序及关闭的示例
Nov 06 Python
Python进程间通信Queue消息队列用法分析
May 22 Python
简单了解python中对象的取反运算符
Jul 01 Python
浅谈python累加求和+奇偶数求和_break_continue
Feb 25 Python
python实现简单俄罗斯方块
Mar 13 Python
python tqdm库的使用
Nov 30 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
yii框架中的Url生产问题小结
2012/01/16 PHP
国外十大最流行的PHP框架排名
2013/07/04 PHP
PHP生成网站桌面快捷方式代码分享
2014/10/11 PHP
Linux下 php7安装redis的方法
2018/11/01 PHP
JavaScript 动态将数字金额转化为中文大写金额
2009/05/14 Javascript
JQuery jsonp 使用示例代码
2009/08/12 Javascript
微博@符号的用户名提示效果。(想@到谁?)
2010/11/05 Javascript
js Html结构转字符串形式显示代码
2011/11/15 Javascript
js opener的使用详解
2014/01/11 Javascript
简述AngularJS的控制器的使用
2015/06/16 Javascript
JQuery fileupload插件实现文件上传功能
2016/03/18 Javascript
jQuery实用小技巧_输入框文字获取和失去焦点的简单实例
2016/08/25 Javascript
浅谈jQuery效果函数
2016/09/16 Javascript
如何正确理解javascript的模块化
2017/03/02 Javascript
javascript按钮禁用和启用的效果实例代码
2017/10/29 Javascript
javascript用rem来做响应式开发
2018/01/13 Javascript
Vue组件通信的四种方式汇总
2018/02/08 Javascript
vue-cli开发环境实现跨域请求的方法
2018/04/07 Javascript
详解如何在微信小程序开发中正确的使用vant ui组件
2018/09/13 Javascript
JavaScript函数重载操作实例浅析
2020/05/02 Javascript
解决antd datepicker 获取时间默认少8个小时的问题
2020/10/29 Javascript
Vue 打包的静态文件不能直接运行的原因及解决办法
2020/11/19 Vue.js
[01:56]生活中的妖精之七夕特别档
2016/08/09 DOTA
[18:16]sakonoko 2017年卡尔集锦
2018/02/06 DOTA
布同自制Python函数帮助查询小工具
2011/03/13 Python
python根据距离和时长计算配速示例
2014/02/16 Python
python实现上传样本到virustotal并查询扫描信息的方法
2014/10/05 Python
Python 带有参数的装饰器实例代码详解
2018/12/06 Python
DataFrame 数据合并实现(merge,join,concat)
2020/06/14 Python
借助HTML5 Canvas来绘制三角形和矩形等多边形的方法
2016/03/14 HTML / CSS
幼儿园中秋节活动方案
2014/02/06 职场文书
入学申请自荐信范文
2014/02/26 职场文书
《开国大典》教学反思
2014/04/19 职场文书
小学教师个人先进事迹材料
2014/05/17 职场文书
就业意向书
2014/07/29 职场文书
springboot 启动如何排除某些bean的注入
2021/08/02 Java/Android