Django框架之中间件MiddleWare的实现

作者:老王同鞋 时间:2021-03-25 15:08:30 

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

来源:https://www.cnblogs.com/chao666/p/12113206.html

标签:Django,中间件,MiddleWare
0
投稿

猜你喜欢

  • 关于Vue单页面骨架屏实践记录

    2024-05-09 15:14:23
  • sqlserver 存储过程中的top+变量使用分析(downmoon)

    2024-01-13 13:03:41
  • 网站如何使用黄金分割布局

    2010-11-05 18:34:00
  • python win32 简单操作方法

    2022-05-23 01:47:42
  • Python读取excel中的图片完美解决方法

    2022-06-07 09:57:18
  • Web 开发常用工具 大家自己查找下载

    2022-09-20 23:58:30
  • 基于Python实现体育彩票选号器功能代码实例

    2021-06-15 17:48:54
  • 实现Python3数组旋转的3种算法实例

    2021-11-12 04:23:10
  • Python内建类型str源码学习

    2021-12-24 22:24:33
  • Python获取当前脚本文件夹(Script)的绝对路径方法代码

    2021-05-27 09:57:52
  • mysql8创建、删除用户以及授权、消权操作详解

    2024-01-13 22:46:34
  • 解决pytorch 数据类型报错的问题

    2022-12-22 08:55:04
  • Go 每日一库之termtables的使用

    2024-05-22 10:20:25
  • Python OpenCV 针对图像细节的不同操作技巧

    2021-08-13 01:29:22
  • python docx 中文字体设置的操作方法

    2021-01-12 22:33:44
  • 原生Javascript插件开发实践

    2024-04-17 09:43:45
  • Python绘制雷达图时遇到的坑的解决

    2021-05-18 00:09:03
  • 详解JavaScript中的作用域链与闭包

    2024-04-22 13:07:00
  • python中windows链接linux执行命令并获取执行状态的问题小结

    2022-05-18 12:56:55
  • HTML5设计原则

    2012-04-26 16:46:45
  • asp之家 网络编程 m.aspxhome.com