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脚本分享
Apr 21 Python
python使用suds调用webservice接口的方法
Jan 03 Python
selenium+python自动化测试之使用webdriver操作浏览器的方法
Jan 23 Python
零基础使用Python读写处理Excel表格的方法
May 02 Python
django的model操作汇整详解
Jul 26 Python
Python获取时间范围内日期列表和周列表的函数
Aug 05 Python
详解python 中in 的 用法
Dec 12 Python
Python MySQL 日期时间格式化作为参数的操作
Mar 02 Python
Python 去除字符串中指定字符串
Mar 05 Python
linux mint中搜狗输入法导致pycharm卡死的问题
Oct 28 Python
基于python模拟bfs和dfs代码实例
Nov 19 Python
Python 数据可视化之Matplotlib详解
Nov 02 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编写PDF文档生成器
2006/10/09 PHP
小文件php+SQLite存储方案
2010/09/04 PHP
CI框架开发新浪微博登录接口源码完整版
2014/05/28 PHP
PHP实现货币换算的方法
2014/11/29 PHP
PHP常用的三种设计模式汇总
2016/08/28 PHP
Linux下 php7安装redis的方法
2018/11/01 PHP
event.srcElement 用法笔记e.target
2009/12/18 Javascript
JS(JQuery)操作Array的相关方法介绍
2014/02/11 Javascript
js实现鼠标经过时图片滚动停止的方法
2015/02/16 Javascript
JavaScript中DOM详解
2015/04/13 Javascript
JS/Jquery判断对象为空的方法
2015/06/11 Javascript
基于jQuery Bar Indicator 插件实现进度条展示效果
2015/09/30 Javascript
jQuery将表单序列化成一个Object对象的实例
2016/11/29 Javascript
React实现点击删除列表中对应项
2017/01/10 Javascript
Angularjs中使用layDate日期控件示例
2017/01/11 Javascript
关于meta viewport中target-densitydpi属性详解(推荐)
2017/08/18 Javascript
详解Vue.js中引入图片路径的几种方式
2019/06/17 Javascript
tensorflow TFRecords文件的生成和读取的方法
2018/02/06 Python
详谈Python3 操作系统与路径 模块(os / os.path / pathlib)
2018/04/26 Python
python中bs4.BeautifulSoup的基本用法
2019/07/27 Python
python获取引用对象的个数方式
2019/12/20 Python
Tensorflow 卷积的梯度反向传播过程
2020/02/10 Python
python GUI库图形界面开发之PyQt5信号与槽多窗口数据传递详细使用方法与实例
2020/03/08 Python
使用Django清空数据库并重新生成
2020/04/03 Python
Python实现列表中非负数保留,负数转化为指定的数值方式
2020/06/04 Python
Jupyter Notebook添加代码自动补全功能的实现
2021/01/07 Python
H5新属性audio音频和video视频的控制详解(推荐)
2016/12/09 HTML / CSS
迷你西餐厅创业计划书范文
2013/12/31 职场文书
校园招聘策划书
2014/01/09 职场文书
自荐信的格式
2014/03/10 职场文书
实习单位鉴定评语
2014/04/26 职场文书
经典搞笑版检讨书
2015/02/19 职场文书
仓库统计员岗位职责
2015/04/14 职场文书
小学教研工作总结2015
2015/05/13 职场文书
收入证明申请书
2015/06/12 职场文书
Python使用pandas导入xlsx格式的excel文件内容操作代码
2022/12/24 Python