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 相关文章推荐
在RedHat系Linux上部署Python的Celery框架的教程
Apr 07 Python
Python利用ansible分发处理任务
Aug 04 Python
python字典快速保存于读取的方法
Mar 23 Python
Python 实现使用dict 创建二维数据、DataFrame
Apr 13 Python
Python编程深度学习计算库之numpy
Dec 28 Python
django的ORM模型的实现原理
Mar 04 Python
python版DDOS攻击脚本
Jun 12 Python
Python实现图像去噪方式(中值去噪和均值去噪)
Dec 18 Python
PyCharm汉化安装及永久激活详细教程(靠谱)
Jan 16 Python
后端开发使用pycharm的技巧(推荐)
Mar 27 Python
python 实现图片批量压缩的示例
Dec 18 Python
浅析Python中的随机采样和概率分布
Dec 06 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类(查找/修改)xml文档
2013/03/26 PHP
phpize的深入理解
2013/06/03 PHP
PHP使用逆波兰式计算工资的方法
2015/07/29 PHP
PHP数学运算与数据处理实例分析
2016/04/01 PHP
PHP中类与对象功能、用法实例解读
2020/03/27 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
setTimeout和setInterval的浏览器兼容性分析
2007/02/27 Javascript
HTML上传控件取消选择
2013/03/06 Javascript
JS中如何设置readOnly的值
2013/12/25 Javascript
js+cookies实现悬浮购物车的方法
2015/05/25 Javascript
jquery关于事件冒泡和事件委托的技巧及阻止与允许事件冒泡的三种实现方法
2015/11/27 Javascript
jQuery动画显示和隐藏效果实例演示(附demo源码下载)
2015/12/31 Javascript
Webwork 实现文件上传下载代码详解
2016/02/02 Javascript
JavaScript必知必会(二) null 和undefined
2016/06/08 Javascript
jQuery 全选 全部选 反选 实现代码
2016/08/17 Javascript
简单的js计算器实现
2016/10/26 Javascript
整理关于Bootstrap列表组的慕课笔记
2017/03/29 Javascript
Vue2.0生命周期的理解
2018/08/20 Javascript
Object.keys() 和 Object.getOwnPropertyNames() 的区别详解
2020/05/21 Javascript
jquery实现上传图片功能
2020/06/29 jQuery
python使用tensorflow深度学习识别验证码
2018/04/03 Python
Python针对给定字符串求解所有子序列是否为回文序列的方法
2018/04/21 Python
手把手教你使用Python创建微信机器人
2019/04/29 Python
TensorFlow加载模型时出错的解决方式
2020/02/06 Python
MADE法国:提供原创设计师家具
2018/09/18 全球购物
最新党员思想汇报
2014/01/01 职场文书
关于逃课的检讨书
2014/01/23 职场文书
精彩广告词大全
2014/03/19 职场文书
《小动物过冬》教学反思
2014/04/17 职场文书
劳资协议书范本
2014/04/23 职场文书
小学安全汇报材料
2014/08/14 职场文书
中学生爱国演讲稿
2014/09/05 职场文书
处世之道:关于真诚相待的名言推荐
2019/12/02 职场文书
2019年中学生的思想品德评语集锦
2019/12/19 职场文书
Ajax常用封装库——Axios的使用
2021/05/08 Javascript
GO中sync包自由控制并发示例详解
2022/08/05 Golang