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 相关文章推荐
探索Python3.4中新引入的asyncio模块
Apr 08 Python
Python中List.index()方法的使用教程
May 20 Python
基于python实现的抓取腾讯视频所有电影的爬虫
Apr 22 Python
pytorch: tensor类型的构建与相互转换实例
Jul 26 Python
Python 加密与解密小结
Dec 06 Python
解决django后台样式丢失,css资源加载失败的问题
Jun 11 Python
在pycharm中显示python画的图方法
Aug 31 Python
修改 CentOS 6.x 上默认Python的方法
Sep 06 Python
PyTorch 对应点相乘、矩阵相乘实例
Dec 27 Python
Python定义一个Actor任务
Jul 29 Python
在pycharm中文件取消用 pytest模式打开的操作
Sep 01 Python
python3访问字典里的值实例方法
Nov 18 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 引用文件技巧
2010/03/02 PHP
PHP写杨辉三角实例代码
2011/07/17 PHP
ThinkPHP中I(),U(),$this->post()等函数用法
2014/11/22 PHP
PHP读取并输出XML文件数据的简单实现方法
2017/12/22 PHP
javascript基础第一章 JavaScript与用户端
2010/07/22 Javascript
TinyMCE 新增本地图片上传功能
2010/11/05 Javascript
JavaScript:new 一个函数和直接调用函数的区别分析
2013/07/10 Javascript
Select标签下拉列表二级联动级联实例代码
2014/02/07 Javascript
jQuery异步获取json数据方法汇总
2014/12/22 Javascript
jquery实现手机号码选号的方法
2015/07/31 Javascript
javascript如何操作HTML下拉列表标签
2015/08/20 Javascript
深入学习JavaScript对象
2015/10/13 Javascript
jQuery实现有动画淡出效果的二级折叠菜单代码
2015/10/17 Javascript
js 获取元素所有兄弟节点的实现方法
2016/09/06 Javascript
JS定时器用法分析【时钟与菜单中的应用】
2016/12/21 Javascript
详解JS去重及字符串奇数位小写转大写
2016/12/29 Javascript
vue学习教程之带你一步步详细解析vue-cli
2017/12/26 Javascript
在layui中使用form表单监听ajax异步验证注册的实例
2019/09/03 Javascript
javascript 原型与原型链的理解及应用实例分析
2020/02/10 Javascript
python实现划词翻译
2020/04/23 Python
Python2中的raw_input() 与 input()
2015/06/12 Python
开始着手第一个Django项目
2015/07/15 Python
简单介绍使用Python解析并修改XML文档的方法
2015/10/15 Python
DRF跨域后端解决之django-cors-headers的使用
2019/01/27 Python
利用Python实现微信找房机器人实例教程
2019/03/10 Python
Python 3.8新特征之asyncio REPL
2019/05/28 Python
selenium 安装与chromedriver安装的方法步骤
2019/06/12 Python
通过实例了解python property属性
2019/11/01 Python
PyTorch中反卷积的用法详解
2019/12/30 Python
python反爬虫方法的优缺点分析
2020/11/25 Python
python+openCV对视频进行截取的实现
2020/11/27 Python
添柏岚英国官方网站:Timberland英国
2019/11/28 全球购物
《兰亭集序》教学反思
2014/02/11 职场文书
高中生打架检讨书1000字
2015/02/17 职场文书
房地产置业顾问岗位职责
2015/04/11 职场文书
少年的你:世界上没有如果,要在第一次就勇敢的反抗
2019/11/20 职场文书