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进行稳定可靠的文件操作详解
Dec 31 Python
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
Jan 23 Python
Python简单删除目录下文件以及文件夹的方法
May 27 Python
Python Socket编程详细介绍
Mar 23 Python
python中装饰器级连的使用方法示例
Sep 29 Python
Python语言生成水仙花数代码示例
Dec 18 Python
python机器学习理论与实战(六)支持向量机
Jan 19 Python
Python实现k-means算法
Feb 23 Python
tensorflow: 查看 tensor详细数值方法
Jun 13 Python
使用Python制作简单的小程序IP查看器功能
Apr 16 Python
python实现人机五子棋
Mar 25 Python
Django实现内容缓存实例方法
Jun 30 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
js下函数般调用正则的方法附代码
2008/06/22 PHP
php 防止单引号,双引号在接受页面转义
2008/07/10 PHP
PHP优于Node.js的五大理由分享
2012/09/15 PHP
php 问卷调查结果统计
2015/10/08 PHP
php实现快速对二维数组某一列进行组装的方法小结
2019/12/04 PHP
PHP8.0新功能之Match表达式的使用
2020/07/19 PHP
JavaScript var声明变量背后的原理示例解析
2013/10/12 Javascript
Windows系统下使用Sublime搭建nodejs环境
2015/04/13 NodeJs
javascript获取网页宽高方法汇总
2015/07/19 Javascript
javascript禁止访客复制网页内容的实现代码
2015/08/05 Javascript
zepto中使用swipe.js制作轮播图附swipeUp,swipeDown不起效果问题
2015/08/27 Javascript
javascript的函数劫持浅析
2016/09/26 Javascript
bootstrap多种样式进度条展示
2016/12/20 Javascript
BootStrap中的Fontawesome 图标
2017/05/25 Javascript
前端主流框架vue学习笔记第一篇
2017/07/26 Javascript
JS将网址url转化为JSON格式的方法
2018/07/02 Javascript
详解mpvue scroll-view自动回弹bug解决方案
2018/10/01 Javascript
JS数组方法reverse()用法实例分析
2020/01/18 Javascript
[50:02]完美世界DOTA2联赛循环赛 Magma vs IO BO2第一场 11.01
2020/11/02 DOTA
python获取一组汉字拼音首字母的方法
2015/07/01 Python
python使用Matplotlib绘制分段函数
2018/09/25 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
2019/01/03 Python
详解python项目实战:模拟登陆CSDN
2019/04/04 Python
很酷的python表白工具 你喜欢我吗
2019/04/11 Python
解决tensorflow训练时内存持续增加并占满的问题
2020/01/19 Python
Expedia丹麦:全球领先的旅游网站
2018/03/18 全球购物
印度排名第一的蛋糕、鲜花和礼品送货:Winni
2019/08/02 全球购物
Java和Javasciprt的区别
2012/09/02 面试题
Linux面试题LINUX系统类
2014/11/19 面试题
中专自我鉴定范文
2013/10/16 职场文书
职业生涯规划书怎么写?
2014/09/14 职场文书
党的群众路线教育实践活动党员个人整改措施
2014/10/27 职场文书
2014年党总支工作总结
2014/12/18 职场文书
中学生自我评价范文
2015/03/03 职场文书
学校趣味运动会开幕词
2016/03/04 职场文书
Oracle 区块链表创建过程详解
2021/05/15 Oracle