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常用列表数据结构小结
Aug 06 Python
使用XML库的方式,实现RPC通信的方法(推荐)
Jun 14 Python
人生苦短我用python python如何快速入门?
Mar 12 Python
关于Python正则表达式 findall函数问题详解
Mar 22 Python
Django框架模板介绍
Jan 15 Python
PyQt5创建一个新窗口的实例
Jun 20 Python
分享一个pycharm专业版安装的永久使用方法
Sep 24 Python
python爬虫爬取幽默笑话网站
Oct 24 Python
python读取raw binary图片并提取统计信息的实例
Jan 09 Python
五分钟学会怎么用Pygame做一个简单的贪吃蛇
Jan 06 Python
python scipy 稀疏矩阵的使用说明
May 26 Python
python中super()函数的理解与基本使用
Aug 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
php 执行系统命令的方法
2009/07/07 PHP
PHP、Java des加密解密实例
2015/04/27 PHP
Java中final关键字详解
2015/08/10 PHP
jQuery中对节点进行操作的相关介绍
2013/04/16 Javascript
javascript函数命名的三种方式及区别介绍
2016/03/22 Javascript
Angularjs为ng-click事件传递参数
2017/06/15 Javascript
JS实现移动端按首字母检索城市列表附源码下载
2017/07/05 Javascript
深入webpack打包原理及loader和plugin的实现
2020/05/06 Javascript
[00:32]2018DOTA2亚洲邀请赛OpTic出场
2018/04/03 DOTA
Python的Flask框架中配置多个子域名的方法讲解
2016/06/07 Python
matplotlib设置legend图例代码示例
2017/12/19 Python
在Python中增加和插入元素的示例
2018/11/01 Python
Django框架中间件定义与使用方法案例分析
2019/11/28 Python
使用opencv将视频帧转成图片输出
2019/12/10 Python
python ftplib模块使用代码实例
2019/12/31 Python
PyCharm无法引用自身项目解决方式
2020/02/12 Python
浅谈python中频繁的print到底能浪费多长时间
2020/02/21 Python
python-sys.stdout作为默认函数参数的实现
2020/02/21 Python
Django 404、500页面全局配置知识点详解
2020/03/10 Python
英国最大的宠物商店:Pets at Home
2019/04/17 全球购物
拖鞋店创业计划书
2014/01/15 职场文书
日本语毕业生自荐信
2014/02/01 职场文书
教师应聘自荐信范文
2014/03/14 职场文书
动员大会主持词
2014/03/20 职场文书
广告艺术设计专业自荐书
2014/07/08 职场文书
群众路线查摆问题及整改措施
2014/10/10 职场文书
公务员党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
爱心助学感谢信
2015/01/21 职场文书
检讨书范文500字
2015/01/28 职场文书
2015年上半年党建工作总结
2015/03/30 职场文书
2015年校务公开工作总结
2015/05/26 职场文书
预备党员表决心的话
2015/09/22 职场文书
2016年安全生产先进个人事迹材料
2016/02/29 职场文书
Python中OpenCV实现简单车牌字符切割
2021/06/11 Python
Java中CyclicBarrier和CountDownLatch的用法与区别
2021/08/23 Java/Android
Python中的socket网络模块介绍
2022/07/23 Python