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 29 Python
简单介绍Python中的len()函数的使用
Apr 07 Python
Python中的filter()函数的用法
Apr 27 Python
学习python之编写简单乘法口诀表实现代码
Feb 27 Python
Python实现字符串格式化的方法小结
Feb 20 Python
Windows下安装python2和python3多版本教程
Mar 30 Python
python实现redis三种cas事务操作
Dec 19 Python
Python3按一定数据位数格式处理bin文件的方法
Jan 24 Python
浅谈Python3中strip()、lstrip()、rstrip()用法详解
Apr 29 Python
Python TCPServer 多线程多客户端通信的实现
Dec 31 Python
用 Python 制作地球仪的方法
Apr 24 Python
python爬虫中采集中遇到的问题整理
Nov 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
最小化数据传输――在客户端存储数据
2006/10/09 PHP
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
windows下PHP APACHE MYSQ完整配置
2007/01/02 PHP
php 分库分表hash算法
2009/11/12 PHP
php实现MySQL数据库备份与还原类实例
2014/12/09 PHP
PHP PDO fetch 模式各种参数的输出结果一览
2015/01/07 PHP
自己的js工具 Cookie 封装
2009/08/21 Javascript
javascript textarea光标定位方法(兼容IE和FF)
2011/03/12 Javascript
jquery实现二级导航下拉菜单效果
2015/12/18 Javascript
浅析Javascript匿名函数与自执行函数
2016/02/06 Javascript
CSS3+JavaScript实现翻页幻灯片效果
2017/06/28 Javascript
3种vue组件的书写形式
2017/11/29 Javascript
webpack-dev-server远程访问配置方法
2018/02/22 Javascript
angular 实现的输入框数字千分位及保留几位小数点功能示例
2018/06/19 Javascript
详解小程序开发经验:多页面数据同步
2019/05/18 Javascript
在vue中实现某一些路由页面隐藏导航栏的功能操作
2020/09/21 Javascript
[02:54]辉夜杯主赛事第二日败者组 iG.V赛后采访
2015/12/26 DOTA
决策树的python实现方法
2014/11/18 Python
python检查指定文件是否存在的方法
2015/07/06 Python
Python 数据结构之堆栈实例代码
2017/01/22 Python
Python+OpenCV图片局部区域像素值处理改进版详解
2019/01/23 Python
python计算Content-MD5并获取文件的Content-MD5值方式
2020/04/03 Python
Python如何实现后端自定义认证并实现多条件登陆
2020/06/22 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
Stefania Mode美国:奢华设计师和时尚服装
2018/01/07 全球购物
意大利在线药房:Saninforma
2021/02/11 全球购物
本科毕业生求职自荐信
2014/02/03 职场文书
人力资源管理求职信
2014/08/07 职场文书
2014年四风问题个人对照自查剖析材料
2014/09/15 职场文书
国际贸易实训报告
2014/11/05 职场文书
会计工作总结范文2014
2014/12/23 职场文书
关于元旦的广播稿2016
2015/12/17 职场文书
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
2021/04/05 MySQL
Python趣味挑战之用pygame实现简单的金币旋转效果
2021/05/31 Python
如何使用Tkinter进行窗口的管理与设置
2021/06/30 Python
nginx 配置指令之location使用详解
2022/05/25 Servers