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 Socket编程入门教程
Jul 11 Python
python 实现上传图片并预览的3种方法(推荐)
Jul 14 Python
Python爬虫框架Scrapy实例代码
Mar 04 Python
pandas 按照特定顺序输出的实现代码
Jul 10 Python
Python绘制股票移动均线的实例
Aug 24 Python
Python 文件操作之读取文件(read),文件指针与写入文件(write),文件打开方式示例
Sep 29 Python
python实现智能语音天气预报
Dec 02 Python
python词云库wordCloud使用方法详解(解决中文乱码)
Feb 17 Python
python之MSE、MAE、RMSE的使用
Feb 24 Python
Django更新models数据库结构步骤
Apr 01 Python
Python编写memcached启动脚本代码实例
Aug 14 Python
Python关于OS文件目录处理的实例分享
May 23 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调用mysql数据 dbclass类
2011/05/07 PHP
php自定义函数call_user_func和call_user_func_array详解
2011/07/14 PHP
php发送post请求函数分享
2014/03/06 PHP
PHP中数据类型转换的三种方式
2015/04/02 PHP
php获取flash尺寸详细数据的方法
2016/11/12 PHP
php调用云片网接口发送短信的实现方法
2017/10/25 PHP
初学js插入节点appendChild insertBefore使用方法
2011/07/04 Javascript
ie8模式下click无反应点击option无反应的解决方法
2014/10/11 Javascript
javascript实现全角半角检测的方法
2015/07/23 Javascript
jQuery ui实现动感的圆角渐变网站导航菜单效果代码
2015/08/26 Javascript
Vue.js在数组中插入重复数据的实现代码
2017/11/17 Javascript
webpack-dev-server远程访问配置方法
2018/02/22 Javascript
详解ESLint在Vue中的使用小结
2018/10/15 Javascript
JS Ajax请求会话过期处理问题解决方法分析
2019/11/16 Javascript
JS window对象简单操作完整示例
2020/01/14 Javascript
vue实现折线图 可按时间查询
2020/08/21 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
2020/10/31 Javascript
[01:20:05]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第二场 2月5日
2021/03/11 DOTA
详细介绍Python中的偏函数
2015/04/27 Python
Python函数式编程指南(一):函数式编程概述
2015/06/24 Python
python处理csv数据动态显示曲线实例代码
2018/01/23 Python
Flask 让jsonify返回的json串支持中文显示的方法
2018/03/26 Python
Python实现的读写json文件功能示例
2018/06/05 Python
Python实现读写INI配置文件的方法示例
2018/06/09 Python
3D动画《斗罗大陆》上线当日播放过亿
2021/03/16 国漫
深入浅析HTML5中的article和section的区别
2018/05/15 HTML / CSS
英国户外服装品牌:Craghoppers
2019/04/25 全球购物
波兰在线运动商店:YesSport
2020/07/23 全球购物
开业庆典邀请函
2014/01/08 职场文书
毕业生就业意向书
2014/04/01 职场文书
忠诚奉献演讲稿
2014/09/12 职场文书
2014年教师个人工作总结
2014/11/10 职场文书
大学生个人年度总结范文
2015/02/15 职场文书
男方婚前保证书
2015/02/28 职场文书
天那边观后感
2015/06/09 职场文书
Java的Object类的九种方法
2022/04/13 Java/Android