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中在for循环中嵌套使用if和else语句的技巧
Jun 20 Python
python生成式的send()方法(详解)
May 08 Python
基于python的多进程共享变量正确打开方式
Apr 28 Python
python中sys.argv函数精简概括
Jul 08 Python
python-opencv颜色提取分割方法
Dec 08 Python
python得到一个excel的全部sheet标签值方法
Dec 10 Python
Django数据库连接丢失问题的解决方法
Dec 29 Python
详解python中的生成器、迭代器、闭包、装饰器
Aug 22 Python
python保留小数位的三种实现方法
Jan 07 Python
Flask和pyecharts实现动态数据可视化
Feb 26 Python
详解Anaconda 的安装教程
Sep 23 Python
在Python 中将类对象序列化为JSON
Apr 06 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程序员工具
2008/05/26 PHP
CodeIgniter基本配置详细介绍
2013/11/12 PHP
php操纵mysqli数据库的实现方法
2016/09/18 PHP
PHP批量获取网页中所有固定种子链接的方法
2016/11/18 PHP
Laravel实现批量更新多条数据
2020/04/06 PHP
CSS和Javascript简单复习资料
2010/06/29 Javascript
jQuery学习笔记[1] jQuery中的DOM操作
2010/12/03 Javascript
广泛收集的jQuery拖放插件集合
2012/04/09 Javascript
简单实用的反馈表单无刷新提交带验证
2013/11/15 Javascript
jQuery中:header选择器用法实例
2014/12/29 Javascript
jQuery+ajax实现无刷新级联菜单示例
2015/05/21 Javascript
JavaScript将DOM事件处理程序封装为event.js 出现的低级错误问题
2016/08/03 Javascript
jquery 实现回车登录详解及实例代码
2016/10/23 Javascript
Bootstrap轮播图的使用和理解4
2016/12/14 Javascript
JavaScript简单生成 N~M 之间随机数的方法
2017/01/13 Javascript
AngularJS的ng-repeat指令与scope继承关系实例详解
2017/01/21 Javascript
Bootstrap按钮组实例详解
2017/07/03 Javascript
微信小程序自定义组件封装及父子间组件传值的方法
2018/08/28 Javascript
微信小程序实现简单评论功能
2018/11/28 Javascript
js纯前端实现腾讯cos文件上传功能的示例代码
2019/05/14 Javascript
在Vue中获取自定义属性方法:data-id的实例
2020/09/09 Javascript
[01:11:02]Secret vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python实现动态添加类的属性或成员函数的解决方法
2014/07/16 Python
详解Python中的装饰器、闭包和functools的教程
2015/04/02 Python
Python装饰器知识点补充
2018/05/28 Python
python判断一个数是否能被另一个整数整除的实例
2018/12/12 Python
python将字符串转换成json的方法小结
2019/07/09 Python
python中class的定义及使用教程
2019/09/18 Python
如何在 Matplotlib 中更改绘图背景的实现
2020/11/26 Python
药品质量检测应届生求职信
2013/11/14 职场文书
企业内部培训方案
2014/02/04 职场文书
公司承诺书怎么写
2014/05/24 职场文书
大跃进口号
2014/06/16 职场文书
财政局党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
2016年党员干部廉政承诺书
2016/03/24 职场文书
在 HTML 页面中使用 React的场景分析
2022/01/18 Javascript