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的Django框架中显示对象子集的方法
Jul 21 Python
Python使用plotly绘制数据图表的方法
Jul 18 Python
pycharm在调试python时执行其他语句的方法
Nov 29 Python
Python中单线程、多线程和多进程的效率对比实验实例
May 14 Python
python输入多行字符串的方法总结
Jul 02 Python
python manage.py runserver流程解析
Nov 08 Python
matplotlib绘制多个子图(subplot)的方法
Dec 03 Python
python中yield的用法详解
Jan 13 Python
python实现杨辉三角的几种方法代码实例
Mar 02 Python
matplotlib之pyplot模块实现添加子图subplot的使用
Apr 25 Python
Django migrate报错的解决方案
May 20 Python
解决Pytorch中关于model.eval的问题
May 22 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
如何给phpcms v9增加类似于phpcms 2008中的关键词表
2013/07/01 PHP
PHP创建桌面快捷方式的实例代码
2014/02/17 PHP
PHP提交表单失败后如何保留已经填写的信息
2014/06/20 PHP
自定义session存储机制避免会话保持问题
2014/10/08 PHP
php递归函数三种实现方法及如何实现数字累加
2015/08/07 PHP
smarty循环嵌套用法示例分析
2016/07/19 PHP
javascript动画效果类封装代码
2007/08/28 Javascript
jQuery ajax cache缓存问题
2010/07/01 Javascript
js文件缓存之版本管理详解
2013/07/05 Javascript
地址栏传递中文参数乱码在js里用escape转码
2013/08/28 Javascript
jQuery实现ichat在线客服插件
2014/12/29 Javascript
jQuery中first()方法用法实例
2015/01/06 Javascript
JavaScript html5 canvas画布中删除一个块区域的方法
2016/01/26 Javascript
javascript封装addLoadEvent实现页面同时加载执行多个函数的方法
2016/07/25 Javascript
Spring Boot+AngularJS+BootStrap实现进度条示例代码
2017/03/02 Javascript
jquery实现倒计时小应用
2017/09/19 jQuery
JS实现基于拖拽改变物体大小的方法
2018/01/23 Javascript
浅谈让你的代码更简短,更整洁,更易读的ES6小技巧
2018/10/25 Javascript
layui实现图片虚拟路径上传,预览和删除的例子
2019/09/25 Javascript
vue导航栏部分的动态渲染实例
2019/11/01 Javascript
python3中dict(字典)的使用方法示例
2017/03/22 Python
Python实现学校管理系统
2018/01/11 Python
Django Admin中增加导出CSV功能过程解析
2019/09/04 Python
Python操作MySQL数据库实例详解【安装、连接、增删改查等】
2020/01/17 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
2020/10/15 Python
Mybag美国/加拿大:英国奢华包包和名牌手袋网站
2020/02/16 全球购物
Pandora德国官网:购买潘多拉手链、戒指、项链和耳环
2020/02/20 全球购物
CHARLES & KEITH加拿大官网:新加坡时尚品牌
2020/03/26 全球购物
为什么要优先使用同步代码块而不是同步方法?
2013/01/30 面试题
食品业务员岗位职责
2014/03/18 职场文书
竞选大学学委演讲稿
2014/09/13 职场文书
中秋节慰问信
2015/02/15 职场文书
历史博物馆观后感
2015/06/05 职场文书
趣味运动会简讯
2015/07/20 职场文书
关于销售人员的年终工作总结要点
2019/08/15 职场文书
python开发人人对战的五子棋小游戏
2022/05/02 Python