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利用装饰器进行运算的实例分析
Aug 04 Python
python中pandas.DataFrame排除特定行方法示例
Mar 12 Python
python自定义异常实例详解
Jul 11 Python
Python中使用haystack实现django全文检索搜索引擎功能
Aug 26 Python
python交互式图形编程实例(三)
Nov 17 Python
Python实现简易Web爬虫详解
Jan 03 Python
python深度优先搜索和广度优先搜索
Feb 07 Python
python获取指定字符串中重复模式最高的字符串方法
Jun 29 Python
使用PYTHON解析Wireshark的PCAP文件方法
Jul 23 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
Oct 01 Python
Python3运算符常见用法分析
Feb 14 Python
python playwright之元素定位示例详解
Jul 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类
2006/10/09 PHP
在PHP中使用curl_init函数的说明
2010/11/02 PHP
php基础学习之变量的使用
2011/06/09 PHP
php类常量的使用详解
2013/06/08 PHP
PHP中__autoload和Smarty冲突的简单解决方法
2016/04/08 PHP
PHP面向对象五大原则之依赖倒置原则(DIP)详解
2018/04/08 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
2020/02/15 PHP
用jquery实现学校的校历(asp.net+jquery ui 1.72)
2010/01/01 Javascript
javascript之学会吝啬 精简代码
2010/04/25 Javascript
JS跨域总结
2012/08/30 Javascript
引用外部js乱码问题分析及解决方案
2013/04/12 Javascript
改变状态栏文字的js代码
2014/06/13 Javascript
JS逆序遍历实现代码
2014/12/02 Javascript
AngularJS中的模块详解
2015/01/29 Javascript
基于javascript实现句子翻牌网页版小游戏
2016/03/23 Javascript
javascript简易画板开发
2020/04/12 Javascript
angularJS+requireJS实现controller及directive的按需加载示例
2017/02/20 Javascript
js实现鼠标拖动功能
2017/03/20 Javascript
javascript 数据存储的常用函数总结
2017/06/01 Javascript
javascript实现最长公共子序列实例代码
2018/02/05 Javascript
解决layui 表单元素radio不显示渲染的问题
2019/09/04 Javascript
基于Layui自定义模块的使用方法详解
2019/09/14 Javascript
ionic+html5+API实现双击返回键退出应用
2019/09/17 Javascript
JavaScript setInterval()与setTimeout()计时器
2019/12/27 Javascript
JS寄快递地址智能解析的实现代码
2020/07/16 Javascript
用python3 返回鼠标位置的实现方法(带界面)
2019/07/05 Python
Python数据分析pandas模块用法实例详解
2019/11/20 Python
Python中常用的高阶函数实例详解
2020/02/21 Python
移动HTML5前端框架—MUI的使用
2017/12/18 HTML / CSS
意大利拉斐尔时尚购物网:Raffaello Network(支持中文)
2018/11/09 全球购物
个人授权委托书
2014/04/03 职场文书
党的群众路线对照检查材料
2014/08/27 职场文书
2015年网管个人工作总结
2015/05/22 职场文书
详解Redis主从复制实践
2021/05/19 Redis
yyds什么意思?90后已经听不懂00后讲话了……
2022/02/03 杂记
项目中Nginx多级代理是如何获取客户端的真实IP地址
2022/05/30 Servers