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读取word文档的方法
May 09 Python
Python实现将数据库一键导出为Excel表格的实例
Dec 30 Python
python使用生成器实现可迭代对象
Mar 20 Python
python requests爬取高德地图数据的实例
Nov 10 Python
python 实现交换两个列表元素的位置示例
Jun 26 Python
python 使用socket传输图片视频等文件的实现方式
Aug 07 Python
基于MATLAB和Python实现MFCC特征参数提取
Aug 13 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
Dec 19 Python
Python装饰器原理与基本用法分析
Jan 07 Python
python爬虫使用requests发送post请求示例详解
Aug 05 Python
聊聊Python pandas 中loc函数的使用,及跟iloc的区别说明
Mar 03 Python
python+opencv实现视频抽帧示例代码
Jun 11 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判断图片格式的七种方法小结
2013/06/03 PHP
php中注册器模式类用法实例分析
2015/11/03 PHP
抛弃 PHP 代价太高
2016/04/26 PHP
Thinkphp批量更新数据的方法汇总
2016/06/29 PHP
javascript事件模型代码
2007/07/01 Javascript
javascript setTimeout()传递函数参数(包括传递对象参数)
2010/04/07 Javascript
setTimeout函数兼容各主流浏览器运行执行效果实例
2013/06/13 Javascript
Ajax同步与异步传输的示例代码
2013/11/21 Javascript
分享9点个人认为比较重要的javascript 编程技巧
2015/04/27 Javascript
vue基于Element构建自定义树的示例代码
2017/09/19 Javascript
Mint UI 基于 Vue.js 移动端组件库
2017/11/07 Javascript
vue 监听某个div垂直滚动条下拉到底部的方法
2018/09/15 Javascript
如何用JavaScript实现功能齐全的单链表详解
2019/02/11 Javascript
小程序api实现promise封装过程解析
2019/11/21 Javascript
开发Node CLI构建微信小程序脚手架的示例
2020/03/27 Javascript
[50:28]LGD女子学院第三期 DOTA2复仇之魂教学
2013/12/24 DOTA
Python聚类算法之DBSACN实例分析
2015/11/20 Python
Python 爬虫学习笔记之单线程爬虫
2016/09/21 Python
Python学习pygal绘制线图代码分享
2017/12/09 Python
Python温度转换实例分析
2018/01/17 Python
pycharm使用matplotlib.pyplot不显示图形的解决方法
2018/10/28 Python
python 切换root 执行命令的方法
2019/01/19 Python
详解python3 + Scrapy爬虫学习之创建项目
2019/04/12 Python
Python使用numpy模块实现矩阵和列表的连接操作方法
2019/06/26 Python
pytorch之Resize()函数具体使用详解
2020/02/27 Python
Python importlib动态导入模块实现代码
2020/04/16 Python
Python爬虫防封ip的一些技巧
2020/08/06 Python
CSS3 实现的缩略图悬停效果
2020/12/09 HTML / CSS
北美大型运动类产品商城:Champs Sports
2017/01/12 全球购物
大学生活动策划方案
2014/02/10 职场文书
乡镇精神文明建设汇报材料
2014/08/15 职场文书
禁毒宣传活动总结
2014/08/26 职场文书
二十年同学聚会感言
2015/07/30 职场文书
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
2021/04/13 Python
解析原生JS getComputedStyle
2021/05/25 Javascript
Python必备技巧之字符数据操作详解
2022/03/23 Python