Django框架中间件(Middleware)用法实例分析


Posted in Python onMay 24, 2019

本文实例讲述了Django框架中间件(Middleware)用法。分享给大家供大家参考,具体如下:

1、面向切面编程

  • 切点(钩子)
  • 切点允许我们动态的在原有逻辑中插入一部分代码
  • 在不修改原有代码的情况下,动态注入一部分代码
  • 默认情况,不中断传播,切点会自动愈合(自动执行原有逻辑)
  • 如果我们执行了中断操作(return,raise),没接上,会直接到程序结尾
  • 五个切面:1、请求交给路由处理之前;2、请求交给视图处理之前;3、请求交给视图渲染后;4、渲染结果返回给模板之前;5、出现异常。

2、Django中的中间件

  • 框架内置切点
    • init
    • 没有参数,服务器响应第一个请求的时候自动调用,用户确定是否启用该中间件
    • process_request(self,request)
    • 在执行视图前被调用,每个请求上都会调用
    • 不返回或返回HttpResponse对象
    • process_view(self,request,view_func,view_args,view_kwargs)
    • 调用视图之前执行,每个请求都会调用
    • 不返回或返回HttpResponse对象
    • process_template_response(self,request,response)
    • 在视图刚好执行完后进行调用,每个请求都会调用
    • 不返回或返回HttpResponse对象
    • process_response(self,request,response)
    • 所有响应返回浏览器之前调用,每个请求都会调用
    • 不返回或返回HttpResponse对象
    • process_exception(self,request,exception)
    • 当视图抛出异常时调用
    • 不返回或返回HttpResponse对象
from django.http import HttpResponse
from django.shortcuts import render, redirect
from django.urls import reverse
from django.utils.deprecation import MiddlewareMixin
from MidUpVcode.settings import BLACK_LIST, VIP_LIST
'''
所有的钩子函数都可以返回一个Response
一旦钩子函数返回了Response,整个请求的受理就结束了
'''
# 继承于框架中间件
class MyappMiddleware(MiddlewareMixin):
 # 中间件的初始化方法,全局执行一次
 # def __init__(self, get_response=None):
 #   super(MyappMiddleware, self).__init__()
 #   print(">>>>>>>>>> MyappMiddlware __init__")
 # 下钩子于所有路由被交给路由表之前
 def process_request(self, request):
   # 获取客户端IP地址
   clientIp = request.META['REMOTE_ADDR']
   # 请求的路由
   url = request.path
   print(">>> process_request", request, clientIp, url)
   # # 屏蔽黑名单用户
   # 只要客户端IP在黑名单中
   # if clientIp in BLACK_LIST:
   #   直接渲染fuckoff.html并立刻返回
   #   return render(request,'fuckoff.html')
   # # 当VIP用户访问福利页面时提供更多好的服务
   # if clientIp in VIP_LIST and url=='/myapp/fuli/':
   #   return render(request, 'fuli.html', context={'imgpath': 'meinv1.jpg'})
   # 福利页必须登录了才能查看
   if url == '/myapp/fuli/' and not request.session.get('uname', None):
     return redirect(reverse('myapp:login'))
 # 下钩子于所有路由请求被交给视图函数之前
 def process_view(self, request, view_func, view_args, view_kwargs):
   print(">>> process_view", request, view_func, view_args, view_kwargs)
 # 理论上下钩子于所有路由请求的模板被渲染完成以后
 # 这个函数实测无法回调
 def process_template_response(self, request, response):
   print(">>>>>>>>>> process_template_response", request, response)
   return response
 # 下钩子于所有路由的响应被返回之前
 def process_response(self, request, response):
   print(">>>>>>>>>> process_response", request, response)
   return response
 def process_exception(self, request, exception):
   print(">>>>>>>>>> process_exception", request, exception)
   return redirect('/')

3、自定义中间件

  • 用途
    • 统计
    • 黑名单
    • 白名单
    • 反爬(redis)
    • 界面友好化(捕获异常)
  • 流程
    • 在工程目录下创建middleware目录

Django框架中间件(Middleware)用法实例分析

  • 继承MiddleWareMixin
class LearnAOP(MiddlewareMixin):
  def process_request(self,request):
    print('request的路径',request.GET.path)
  • 覆写切点方法,实现自己的功能
  • 如果我们逻辑中没有返回值,那么程序执行的时候会按照原有逻辑执行
  • 如果我们做出了返回,那么程序将会从切点处切开,直接回到浏览器
  • 在settings中进行注册
MIDDLEWARE = [
  ...
  # 注册自定义的中间件
  'middleware.MyMiddleware.MyappMiddleware',
  ...
]

希望本文所述对大家基于Django框架的Python程序设计有所帮助。

Python 相关文章推荐
python将xml xsl文件生成html文件存储示例讲解
Dec 03 Python
Python实现扫描指定目录下的子目录及文件的方法
Jul 16 Python
python 读取竖线分隔符的文本方法
Dec 20 Python
Flask核心机制之上下文源码剖析
Dec 25 Python
Python使用MyQR制作专属动态彩色二维码功能
Jun 04 Python
python 中xpath爬虫实例详解
Aug 26 Python
python基于property()函数定义属性
Jan 22 Python
五分钟带你搞懂python 迭代器与生成器
Aug 30 Python
Python 操作 MySQL数据库
Sep 18 Python
解决python3.x安装numpy成功但import出错的问题
Nov 17 Python
用python查找统一局域网下ip对应的mac地址
Jan 13 Python
Python中Selenium对Cookie的操作方法
Jul 09 Python
python与字符编码问题
May 24 #Python
Python读取stdin方法实例
May 24 #Python
python实践项目之监控当前联网状态详情
May 23 #Python
了解不常见但是实用的Python技巧
May 23 #Python
python远程邮件控制电脑升级版
May 23 #Python
python操作日志的封装方法(两种方法)
May 23 #Python
Python除法之传统除法、Floor除法及真除法实例详解
May 23 #Python
You might like
php下载文件源代码(强制任意文件格式下载)
2014/05/09 PHP
浅析php创建者模式
2014/11/25 PHP
实例详解PHP中html word 互转的方法
2016/01/28 PHP
WordPress的文章自动添加关键词及关键词的SEO优化
2016/03/01 PHP
Yii rules常用规则示例
2016/03/15 PHP
php递归函数怎么用才有效
2018/02/24 PHP
Laravel 在views中加载公共页面的实现代码
2019/10/22 PHP
JS控制图片等比例缩放的示例代码
2013/12/24 Javascript
纯JS实现旋转图片3D展示效果
2015/04/12 Javascript
jQuery获取单击节点对象的方法
2016/06/02 Javascript
Javascript OOP之面向对象
2016/07/31 Javascript
基于Javascript实现的不重复ID的生成器
2016/12/25 Javascript
loading动画特效小结
2017/01/22 Javascript
angular实现表单验证及提交功能
2017/02/01 Javascript
深入理解JavaScript中的尾调用(Tail Call)
2017/02/07 Javascript
AngularJS实现的回到顶部指令功能实例
2017/05/17 Javascript
vue axios数据请求及vue中使用axios的方法
2018/09/10 Javascript
详解html-webpack-plugin插件(用法总结)
2018/09/12 Javascript
javascript中的event loop事件循环详解
2018/12/14 Javascript
浅谈vue中document.getElementById()拿到的是原值的问题
2020/07/26 Javascript
[10:07]2014DOTA2国际邀请赛 实拍选手现场观战DK对阵Titan
2014/07/12 DOTA
Python基于Pymssql模块实现连接SQL Server数据库的方法详解
2017/07/20 Python
python中利用await关键字如何等待Future对象完成详解
2017/09/07 Python
django3.02模板中的超链接配置实例代码
2020/02/04 Python
python 工具 字符串转numpy浮点数组的实现
2020/03/14 Python
浅谈python opencv对图像颜色通道进行加减操作溢出
2020/06/03 Python
使用phonegap获取位置信息的实现方法
2017/03/31 HTML / CSS
Myprotein法国官网:欧洲第一运动营养品牌
2019/03/26 全球购物
UNIX文件系统分类
2014/11/11 面试题
编辑求职信样本
2013/12/16 职场文书
校运动会广播稿300字
2014/10/07 职场文书
政协会议宣传标语
2014/10/09 职场文书
2015年财务人员工作总结
2015/04/10 职场文书
2015年幼儿园保育工作总结
2015/05/12 职场文书
2015秋季开学典礼致辞
2015/07/16 职场文书
毕业班工作总结
2015/08/10 职场文书