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读大数据txt
Mar 28 Python
django model去掉unique_together报错的解决方案
Oct 18 Python
python中numpy基础学习及进行数组和矢量计算
Feb 12 Python
Python多线程经典问题之乘客做公交车算法实例
Mar 22 Python
python中如何使用朴素贝叶斯算法
Apr 06 Python
详解python OpenCV学习笔记之直方图均衡化
Feb 08 Python
tensorflow-gpu安装的常见问题及解决方案
Jan 20 Python
keras 自定义loss model.add_loss的使用详解
Jun 22 Python
Python+unittest+requests 接口自动化测试框架搭建教程
Oct 09 Python
Python中npy和mat文件的保存与读取
Apr 24 Python
Python 图片添加美颜效果
Apr 28 Python
Python中的协程(Coroutine)操作模块(greenlet、gevent)
May 30 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
PHP4实际应用经验篇(1)
2006/10/09 PHP
php你的验证码安全码?
2007/01/02 PHP
PHP 字符串编码截取函数(兼容utf-8和gb2312)
2009/05/02 PHP
探讨各种PHP字符串函数的总结分析
2013/06/05 PHP
ThinkPHP表单自动验证实例
2014/10/13 PHP
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
2016/07/25 PHP
golang、python、php、c++、c、java、Nodejs性能对比
2017/03/12 NodeJs
php获取微信共享收货地址的方法
2017/12/21 PHP
php实例化一个类的具体方法
2019/09/19 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
2019/09/29 PHP
Jquery ThickBox插件使用心得(不建议使用)
2010/09/08 Javascript
jQuery内置的AJAX功能和JSON的使用实例
2014/07/27 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
2016/06/29 Javascript
jQuery实现的自定义滚动条实例详解
2016/09/20 Javascript
常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全(推荐)
2016/12/20 Javascript
web打印小结
2017/01/11 Javascript
微信小程序中的onLoad详解及简单实例
2017/04/05 Javascript
详解Angular 自定义结构指令
2017/06/21 Javascript
Vue中引入样式文件的方法
2017/08/18 Javascript
vue中component组件的props使用详解
2017/09/04 Javascript
jQuery实现的表格前端排序功能示例
2017/09/18 jQuery
three.js中文文档学习之通过模块导入
2017/11/20 Javascript
vue.js实现回到顶部动画效果
2019/07/31 Javascript
关于layui 实现点击按钮添加一行(方法渲染创建的table)
2019/09/29 Javascript
Vue+Node实现商品列表的分页、排序、筛选,添加购物车功能详解
2019/12/07 Javascript
浅谈VUE中演示v-for为什么要加key
2020/01/16 Javascript
Python脚本实时处理log文件的方法
2016/11/21 Python
python数据清洗系列之字符串处理详解
2017/02/12 Python
python如何实现单链表的反转
2020/02/10 Python
html5 touch事件实现触屏页面上下滑动(一)
2016/03/10 HTML / CSS
DataReader和DataSet的异同
2014/12/31 面试题
教导处工作制度
2014/01/18 职场文书
运输服务质量承诺书
2014/03/27 职场文书
2015重阳节敬老活动总结
2015/07/29 职场文书
老兵退伍感言
2015/08/03 职场文书
安全事故隐患排查治理制度
2015/08/05 职场文书