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正则表达式re模块详细介绍
May 29 Python
用Python遍历C盘dll文件的方法
May 06 Python
python实现感知器算法详解
Dec 19 Python
python 实现对文件夹内的文件排序编号
Apr 12 Python
python日期时间转为字符串或者格式化输出的实例
May 29 Python
使用pandas实现连续数据的离散化处理方式(分箱操作)
Nov 22 Python
python实现超市商品销售管理系统
Nov 22 Python
Python创建一个元素都为0的列表实例
Nov 28 Python
Python递归求出列表(包括列表中的子列表)的最大值实例
Feb 27 Python
Python的轻量级ORM框架peewee使用教程
Feb 05 Python
浅谈Python数学建模之数据导入
Jun 23 Python
Python多个MP4合成视频的实现方法
Jul 16 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文章内容分页并生成相应的htm静态页面代码
2010/06/07 PHP
PHP rawurlencode与urlencode函数的深入分析
2013/06/08 PHP
使用新浪微博API的OAuth认证发布微博实例
2015/03/27 PHP
Yii框架中sphinx索引配置方法解析
2016/10/18 PHP
验证用户是否修改过页面的数据的实现方法
2008/09/26 Javascript
javascript写的简单的计算器,内容很多,方法实用,推荐
2011/12/29 Javascript
javascript获取隐藏元素(display:none)的高度和宽度的方法
2014/06/06 Javascript
jquery插件EasyUI中form表单提交实例分享
2016/01/11 Javascript
Bootstrap3使用typeahead插件实现自动补全功能
2016/07/07 Javascript
AngularJS中update两次出现$promise属性无法识别的解决方法
2017/01/05 Javascript
浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题
2017/09/02 Javascript
vue webpack打包优化操作技巧
2018/02/22 Javascript
详解Angular6学习笔记之主从组件
2018/09/05 Javascript
js中的this的指向问题详解
2019/08/29 Javascript
javascript实现简单打字游戏
2019/10/29 Javascript
vue自定义指令限制输入框输入值的步骤与完整代码
2020/08/30 Javascript
python求素数示例分享
2014/02/16 Python
Python字符串处理函数简明总结
2015/04/13 Python
利用Fn.py库在Python中进行函数式编程
2015/04/22 Python
Python操作列表之List.insert()方法的使用
2015/05/20 Python
celery4+django2定时任务的实现代码
2018/12/23 Python
Python基于Tkinter模块实现的弹球小游戏
2018/12/27 Python
python实现图像检索的三种(直方图/OpenCV/哈希法)
2019/08/08 Python
Python产生一个数值范围内的不重复的随机数的实现方法
2019/08/21 Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
2020/03/16 Python
python通过cython加密代码
2020/12/11 Python
英国景点门票网站:attractiontix
2019/08/27 全球购物
数字天堂软件测试面试题
2012/12/23 面试题
初中科学教学反思
2014/01/21 职场文书
小学教学随笔感言
2014/02/26 职场文书
小学生环保倡议书
2014/05/15 职场文书
2014年巴西世界杯口号
2014/06/05 职场文书
小学生美德少年事迹材料
2014/08/24 职场文书
工程承包协议书
2014/10/20 职场文书
2015商场元旦促销活动策划方案
2014/12/09 职场文书
win11无法登录onedrive错误代码0x8004def7怎么办 ?
2022/04/05 数码科技