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实现从url中提取域名的几种方法
Sep 26 Python
Python中的__SLOTS__属性使用示例
Feb 18 Python
python查询mysql,返回json的实例
Mar 26 Python
Python3实现对列表按元组指定列进行排序的方法分析
Dec 22 Python
Python数据可视化教程之Matplotlib实现各种图表实例
Jan 13 Python
Python生成器的使用方法和示例代码
Mar 04 Python
详解Python读取yaml文件多层菜单
Mar 23 Python
Python实现九宫格式的朋友圈功能内附“马云”朋友圈
May 07 Python
OpenCV+Python--RGB转HSI的实现
Nov 27 Python
Python序列化pickle模块使用详解
Mar 05 Python
Pandas缺失值2种处理方式代码实例
Jun 13 Python
scrapy结合selenium解析动态页面的实现
Sep 28 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下通过file_get_contents的代理使用方法
2011/02/16 PHP
PHP __autoload函数(自动载入类文件)的使用方法
2012/02/04 PHP
php判断访问IP的方法
2015/06/19 PHP
jQuery图片播放8款精美插件分享
2013/02/17 Javascript
简介JavaScript中fixed()方法的使用
2015/06/08 Javascript
Js得到radiobuttonlist选中值的两种方法(推荐)
2016/08/25 Javascript
浅谈jQuery为哪般去掉了浏览器检测
2016/08/29 Javascript
微信小程序中input标签详解及简单实例
2017/05/18 Javascript
原生JS实现隐藏显示图片 JS实现点击切换图片效果
2021/01/27 Javascript
Koa2 之文件上传下载的示例代码
2018/03/29 Javascript
layer.confirm取消按钮绑定事件的方法
2018/08/17 Javascript
详解vue项目中调用百度地图API使用方法
2019/04/25 Javascript
Js实现复选框的全选、全不选反选功能代码实例
2020/02/28 Javascript
js中switch语句的学习笔记
2020/03/25 Javascript
Vue之封装公用变量以及实现方式
2020/07/31 Javascript
vue 解决data中定义图片相对路径页面不显示的问题
2020/08/13 Javascript
解决iview table组件里的 固定列 表格不自适应的问题
2020/11/13 Javascript
[01:58]2018DOTA2亚洲邀请赛趣味视频——交流
2018/04/03 DOTA
Python的内存泄漏及gc模块的使用分析
2014/07/16 Python
Flask-Mail用法实例分析
2018/07/21 Python
python简易实现任意位数的水仙花实例
2018/11/13 Python
python从子线程中获得返回值的方法
2019/01/30 Python
pandas 空数据处理方法详解
2019/11/02 Python
如何在django中添加日志功能
2020/02/06 Python
python实现自动清理重复文件
2020/08/24 Python
解决Python import .pyd 可能遇到路径的问题
2021/03/04 Python
Canvas 文本填充线性渐变的使用详解
2020/06/22 HTML / CSS
纽约著名的服装辅料来源:M&J Trimming
2017/07/26 全球购物
C++:局部变量能否和全局变量重名
2014/03/03 面试题
五年级英语教学反思
2014/01/31 职场文书
大堂副理的岗位职责范文
2014/02/17 职场文书
文秘档案管理岗位职责
2014/03/06 职场文书
2015年艾滋病宣传活动总结
2015/03/27 职场文书
谢师宴学生致辞
2015/07/27 职场文书
python requests模块的使用示例
2021/04/07 Python
python 定义函数 返回值只取其中一个的实现
2021/05/21 Python