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运算π的值深入Python中科学计算的实现
Apr 17 Python
Python的Bottle框架中获取制定cookie的教程
Apr 24 Python
Python语言实现机器学习的K-近邻算法
Jun 11 Python
老生常谈Python序列化和反序列化
Jun 28 Python
Python实现感知器模型、两层神经网络
Dec 19 Python
selenium+python自动化测试之环境搭建
Jan 23 Python
Django框架验证码用法实例分析
May 10 Python
python 使用pygame工具包实现贪吃蛇游戏(多彩版)
Oct 30 Python
简单了解pytest测试框架setup和tearDown
Apr 14 Python
python 如何利用argparse解析命令行参数
Sep 11 Python
python中复数的共轭复数知识点总结
Dec 06 Python
Pandas数据分析的一些常用小技巧
Feb 07 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从数组中随机抽取一些元素的代码
2012/11/05 PHP
使用新浪微博API的OAuth认证发布微博实例
2015/03/27 PHP
php上传图片客户端和服务器端实现方法
2015/03/30 PHP
PHP 开发者该知道的 5 个 Composer 小技巧
2016/02/03 PHP
简单实现php上传文件功能
2017/09/21 PHP
PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析
2018/04/20 PHP
简单通用的JS滑动门代码
2008/12/19 Javascript
Mootools 1.2教程 Fx.Morph、Fx选项和Fx事件
2009/09/15 Javascript
来自qq的javascript面试题
2010/07/24 Javascript
Jquery为a标签的href赋值实现代码
2013/05/03 Javascript
javascript中 try catch用法
2015/08/16 Javascript
基于Jquery和html5的7款个性化地图插件
2015/11/17 Javascript
基于JavaScript实现回到页面顶部动画代码
2016/05/24 Javascript
AngularJs 国际化(I18n/L10n)详解
2016/09/01 Javascript
JS实现的样式切换功能tableCSS实例
2016/12/30 Javascript
Bootstrap3 图片(响应式图片&图片形状)
2017/01/04 Javascript
基于AGS JS开发自定义贴图图层
2017/03/31 Javascript
xmlplus组件设计系列之图标(ICON)(1)
2017/05/05 Javascript
websocket+node.js实现实时聊天系统问题咨询
2017/05/17 Javascript
浅谈node中的exports与module.exports的关系
2017/08/01 Javascript
vue父组件中获取子组件中的数据(实例讲解)
2017/09/27 Javascript
js实现数组内数据的上移和下移的实例
2017/11/14 Javascript
Angular实现点击按钮控制隐藏和显示功能示例
2017/12/29 Javascript
jQuery简单判断值是否存在于数组中的方法示例
2018/04/17 jQuery
Django+Vue跨域环境配置详解
2018/07/06 Javascript
React中使用async validator进行表单验证的实例代码
2018/08/17 Javascript
JS 创建对象的模式实例小结
2020/04/28 Javascript
用python实现的线程池实例代码
2018/01/06 Python
python3写的简单本地文件上传服务器实例
2018/06/04 Python
Python实现多属性排序的方法
2018/12/05 Python
Django框架模板介绍
2019/01/15 Python
python 定时器,轮询定时器的实例
2019/02/20 Python
python 设置输出图像的像素大小方法
2019/07/04 Python
香港最新科技与优质家居产品购物网站:J SELECT
2018/08/21 全球购物
高中生自我鉴定范文
2013/10/30 职场文书
品牌服务方案
2014/06/03 职场文书