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根据路径导入模块的方法
Sep 30 Python
零基础写python爬虫之爬虫的定义及URL构成
Nov 04 Python
Python的Django框架安装全攻略
Jul 15 Python
Python if语句知识点用法总结
Jun 10 Python
python dlib人脸识别代码实例
Apr 04 Python
python实现简单五子棋游戏
Jun 18 Python
Python使用百度翻译开发平台实现英文翻译为中文功能示例
Aug 08 Python
在Python中画图(基于Jupyter notebook的魔法函数)
Oct 28 Python
解决pycharm下pyuic工具使用的问题
Apr 08 Python
python爬虫学习笔记之Beautifulsoup模块用法详解
Apr 09 Python
python使用建议与技巧分享(一)
Aug 17 Python
python FTP编程基础入门
Feb 27 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
无线电的诞生过程
2021/03/01 无线电
IP攻击升级,程序改进以对付新的攻击
2010/11/23 PHP
PHP中删除变量时unset()和null的区别分析
2011/01/27 PHP
PHP中使用Session配合Javascript实现文件上传进度条功能
2014/10/15 PHP
SESSION存放在数据库用法实例
2015/08/08 PHP
php开发微信支付获取用户地址
2015/10/04 PHP
document.open() 与 document.write()的区别
2007/08/13 Javascript
自己的js工具 Cookie 封装
2009/08/21 Javascript
一个轻量级的javascript库 pj介绍
2010/12/19 Javascript
jquery实现在页面加载完毕后获取图片高度或宽度
2014/06/16 Javascript
js style动态设置table高度
2014/10/21 Javascript
JavaScript中的分号插入机制详细介绍
2015/02/11 Javascript
简化版手机端照片预览组件
2015/04/13 Javascript
JS实现获取键盘按下的按键并显示在页面上的方法
2015/11/04 Javascript
关于在Servelet中如何获取当前时间的操作方法
2016/06/28 Javascript
JavaScript实现广告弹窗效果
2016/08/09 Javascript
微信小程序之发送短信倒计时功能
2017/08/30 Javascript
一步一步的了解webpack4的splitChunk插件(小结)
2018/09/17 Javascript
AngularJS上传文件的示例代码
2018/11/10 Javascript
详解Vue CLI 3.0脚手架如何mock数据
2018/11/23 Javascript
vue-cli3 karma单元测试的实现
2019/01/18 Javascript
JS/jQuery实现超简单的Table表格添加,删除行功能示例
2019/07/31 jQuery
使用Karma做vue组件单元测试的实现
2020/01/16 Javascript
vue cli4.0项目引入typescript的方法
2020/07/17 Javascript
Python银行系统实战源码
2019/10/25 Python
Pycharm中import torch报错的快速解决方法
2020/03/05 Python
Python sorted排序方法如何实现
2020/03/31 Python
CSS3实现超慢速移动动画效果非常流畅无卡顿
2014/06/15 HTML / CSS
COACH德国官方网站:纽约现代奢侈品牌,1941年
2018/06/09 全球购物
教育学专业实习生的自我鉴定
2013/11/26 职场文书
石油大学毕业生自荐信
2014/01/28 职场文书
优秀管理者获奖感言
2014/02/17 职场文书
《孔子游春》教学反思
2014/02/25 职场文书
药剂专业求职信
2014/06/20 职场文书
社区禁毒宣传活动总结
2015/05/07 职场文书
2020年基层司法所建设情况调研报告
2019/11/30 职场文书