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中for循环下的索引变量的作用域
Apr 15 Python
CentOS 7下Python 2.7升级至Python3.6.1的实战教程
Jul 06 Python
Python环境搭建之OpenCV的步骤方法
Oct 20 Python
Python利用matplotlib.pyplot绘图时如何设置坐标轴刻度
Apr 09 Python
Pycharm导入Python包,模块的图文教程
Jun 13 Python
如何使用Python实现斐波那契数列
Jul 02 Python
python中用logging实现日志滚动和过期日志删除功能
Aug 20 Python
django中嵌套的try-except实例
May 21 Python
可视化pytorch 模型中不同BN层的running mean曲线实例
Jun 24 Python
Python爬虫爬取ts碎片视频+验证码登录功能
Feb 22 Python
用Python生成会跳舞的美女
Jan 18 Python
python中对列表的删除和添加方法详解
Feb 24 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 读取大文件的X行到Y行内容的实现代码
2013/06/24 PHP
php列出mysql表所有行和列的方法
2015/03/13 PHP
Laravel中的chunk组块结果集处理与注意问题
2018/08/15 PHP
laravel model 两表联查示例
2019/10/24 PHP
jQuery实现的Email中的收件人效果(按del键删除)
2011/03/20 Javascript
JAVASCRIPT车架号识别/验证函数代码 汽车车架号验证程序
2012/01/08 Javascript
jquery实现带二级菜单的导航示例
2014/04/28 Javascript
JQuery的Ajax中Post方法传递中文出现乱码的解决方法
2014/10/21 Javascript
分享自己用JS做的扫雷小游戏
2016/02/17 Javascript
RequireJS多页面应用实例分析
2016/06/29 Javascript
浅谈js对象的创建和对6种继承模式的理解和遐想
2016/10/16 Javascript
使用canvas进行图像编辑的实例
2017/08/29 Javascript
微信小程序前端自定义分享的实现方法
2019/06/13 Javascript
vue router总结 $router和$route及router与 router与route区别
2019/07/05 Javascript
原生js实现商品筛选功能
2019/10/28 Javascript
vue实现的封装全局filter并统一管理操作示例
2020/02/02 Javascript
原生js实现滑块区间组件
2021/01/20 Javascript
设计模式中的原型模式在Python程序中的应用示例
2016/03/02 Python
Python使用ctypes调用C/C++的方法
2019/01/29 Python
浅析python内置模块collections
2019/11/15 Python
python3格式化字符串 f-string的高级用法(推荐)
2020/03/04 Python
详解python对象之间的交互
2020/09/29 Python
佳能德国网上商店:Canon德国
2017/03/18 全球购物
Lacoste澳大利亚官网:服装、鞋类及配饰
2018/11/14 全球购物
教师年终个人自我评价
2013/10/04 职场文书
体育教师工作总结的自我评价
2013/10/10 职场文书
质检员的岗位职责
2013/11/15 职场文书
法学函授自我鉴定
2014/02/06 职场文书
《微笑着面对生活》优秀演讲稿范文
2014/09/23 职场文书
学院党的群众路线教育实践活动第一阶段情况汇报
2014/10/25 职场文书
2014年部门工作总结
2014/11/12 职场文书
慈善献爱心倡议书
2015/04/27 职场文书
《抽屉原理》教学反思
2016/02/20 职场文书
python numpy中setdiff1d的用法说明
2021/04/22 Python
MongoDB使用场景总结
2022/02/24 MongoDB
《吸血鬼:避世 血猎》官宣4.27发售 系列首款大逃杀
2022/04/03 其他游戏