Django框架教程之中间件MiddleWare浅析


Posted in Python onDecember 29, 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中利用Into包整洁地进行数据迁移的教程
Mar 30 Python
python将每个单词按空格分开并保存到文件中
Mar 19 Python
Python中Proxypool库的安装与配置
Oct 19 Python
python将.ppm格式图片转换成.jpg格式文件的方法
Oct 27 Python
Python3中lambda表达式与函数式编程讲解
Jan 14 Python
Python3.5内置模块之os模块、sys模块、shutil模块用法实例分析
Apr 27 Python
Python实现语音识别和语音合成功能
Sep 20 Python
Python面向对象之继承原理与用法案例分析
Dec 31 Python
Scrapy框架基本命令与settings.py设置
Feb 06 Python
Python如何访问字符串中的值
Feb 09 Python
tensorflow模型转ncnn的操作方式
May 25 Python
python用什么编辑器进行项目开发
Jun 17 Python
三个python爬虫项目实例代码
Dec 28 #Python
python scrapy重复执行实现代码详解
Dec 28 #Python
Python统计时间内的并发数代码实例
Dec 28 #Python
如何基于python实现脚本加密
Dec 28 #Python
python使用配置文件过程详解
Dec 28 #Python
python正则表达式匹配IP代码实例
Dec 28 #Python
python爬虫模拟浏览器访问-User-Agent过程解析
Dec 28 #Python
You might like
PHP的ASP防火墙
2006/10/09 PHP
用PHP和ACCESS写聊天室(六)
2006/10/09 PHP
PHP如何利用P3P实现跨域
2013/08/24 PHP
CodeIgniter安全相关设置汇总
2014/07/03 PHP
两种设置php载入页面时编码的方法
2014/07/29 PHP
PHP+Ajax无刷新带进度条图片上传示例
2017/02/08 PHP
[原创]js与自动伸缩图片 自动缩小图片的多浏览器兼容的方法总结
2007/03/12 Javascript
js中判断数字\字母\中文的正则表达式 (实例)
2012/06/29 Javascript
JavaScript实现拼音排序的方法
2012/11/20 Javascript
node.js中的fs.unlink方法使用说明
2014/12/15 Javascript
jQuery实现数字加减效果汇总
2014/12/16 Javascript
JavaScript中的parse()方法使用简介
2015/06/12 Javascript
js实现数组冒泡排序、快速排序原理
2016/03/08 Javascript
jQuery中的insertBefore(),insertAfter(),after(),before()区别介绍
2016/09/01 Javascript
js实现登录注册框手机号和验证码校验(前端部分)
2017/09/28 Javascript
JS求1到任意数之间的所有质数的方法详解
2019/05/20 Javascript
运用js实现图层拖拽的功能
2019/05/24 Javascript
javascript面向对象程序设计实践常用知识点总结
2019/07/29 Javascript
详解vue3.0 的 Composition API 的一种使用方法
2020/10/26 Javascript
python使用paramiko模块实现ssh远程登陆上传文件并执行
2014/01/27 Python
python基于Tkinter库实现简单文本编辑器实例
2015/05/05 Python
python+selenium实现163邮箱自动登陆的方法
2017/12/31 Python
PyQt5主窗口动态加载Widget实例代码
2018/02/07 Python
Django使用详解:ORM 的反向查找(related_name)
2018/05/30 Python
Python字典对象实现原理详解
2019/07/01 Python
浅谈Python小波分析库Pywavelets的一点使用心得
2019/07/09 Python
python cumsum函数的具体使用
2019/07/29 Python
django的403/404/500错误自定义页面的配置方式
2020/05/21 Python
CSS3中31种选择器使用方法教程
2013/12/05 HTML / CSS
美国首屈一指的高品质珠宝设计师和零售商:Allurez
2018/01/23 全球购物
"序列点" 是什么
2016/07/29 面试题
幼儿园教育教学反思
2014/01/31 职场文书
教师专业自荐信
2014/05/31 职场文书
圆明园观后感
2015/06/03 职场文书
陈斌强事迹观后感
2015/06/17 职场文书
超详细Python解释器新手安装教程
2021/05/10 Python