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标准库中的wave模块绘制乐谱的简单教程
Mar 30 Python
python 实现tar文件压缩解压的实例详解
Aug 20 Python
基于numpy.random.randn()与rand()的区别详解
Apr 17 Python
Win8下python3.5.1安装教程
Jul 29 Python
PyQt5内嵌浏览器注入JavaScript脚本实现自动化操作的代码实例
Feb 13 Python
Python3利用print输出带颜色的彩色字体示例代码
Apr 08 Python
Python 实现取多维数组第n维的前几位
Nov 26 Python
Python读取文件内容为字符串的方法(多种方法详解)
Mar 04 Python
使用Python文件读写,自定义分隔符(custom delimiter)
Jul 05 Python
Python约瑟夫生者死者小游戏实例讲解
Jan 04 Python
解决pycharm修改代码后第一次运行不生效的问题
Feb 06 Python
利用Selenium添加cookie实现自动登录的示例代码(fofa)
May 08 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字符串截取问题
2006/11/28 PHP
php中几种常见安全设置详解
2010/04/06 PHP
PHP中防止SQL注入攻击和XSS攻击的两个简单方法
2010/04/15 PHP
如何把php5.3版本升级到php5.4或者php5.5
2015/07/31 PHP
PHP+JQuery+Ajax实现分页方法详解
2016/08/06 PHP
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
Javascript面向对象设计一 工厂模式
2011/12/20 Javascript
jquery创建一个ajax关键词数据搜索实现思路
2013/02/26 Javascript
JavaScript的模块化:封装(闭包),继承(原型) 介绍
2013/07/22 Javascript
常见表单重复提交问题整理及解决方法
2013/11/13 Javascript
正则表达式中特殊符号及正则表达式的几种方法总结(replace,test,search)
2013/11/26 Javascript
jQuery对html元素的取值与赋值实例详解
2015/12/18 Javascript
jquery中键盘事件小结
2016/02/24 Javascript
JavaScript实现解析INI文件内容的方法
2016/11/17 Javascript
使用jQuery和ajax代替iframe的方法(详解)
2017/04/12 jQuery
VsCode新建VueJs项目的详细步骤
2017/09/23 Javascript
Vue如何从1.0迁移到2.0
2017/10/19 Javascript
Bootstrap Fileinput 4.4.7文件上传实例详解
2018/07/25 Javascript
更改BootStrap popover的默认样式及popover简单用法
2018/09/13 Javascript
JavaScript实现点击图片换背景
2020/11/20 Javascript
python中xrange和range的区别
2014/05/13 Python
Python写的Socks5协议代理服务器
2014/08/06 Python
使用django-suit为django 1.7 admin后台添加模板
2014/11/18 Python
使用python判断你是青少年还是老年人
2018/11/29 Python
PyTorch 1.0 正式版已经发布了
2018/12/13 Python
Python+AutoIt实现界面工具开发过程详解
2019/08/07 Python
Python 使用 PyMysql、DBUtils 创建连接池提升性能
2019/08/14 Python
Django框架 Pagination分页实现代码实例
2019/09/04 Python
python 如何将数据写入本地txt文本文件的实现方法
2019/09/11 Python
python画微信表情符的实例代码
2019/10/09 Python
美赞臣营养马来西亚旗舰店:Enfagrow马来西亚
2019/07/26 全球购物
培训主管的职业生涯规划
2014/03/06 职场文书
大学生英文求职信范文
2015/03/19 职场文书
开展警示教育活动总结
2015/05/09 职场文书
2019年行政人事个人工作总结范本!
2019/07/19 职场文书
关于PostgreSQL JSONB的匹配和交集问题
2021/09/14 PostgreSQL