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 相关文章推荐
在Django中编写模版节点及注册标签的方法
Jul 20 Python
Python操作MySQL数据库的三种方法总结
Jan 30 Python
python实现飞机大战微信小游戏
Mar 21 Python
python 使用socket传输图片视频等文件的实现方式
Aug 07 Python
在pytorch中查看可训练参数的例子
Aug 18 Python
PyTorch之图像和Tensor填充的实例
Aug 18 Python
python requests更换代理适用于IP频率限制的方法
Aug 21 Python
python 成功引入包但无法正常调用的解决
Mar 09 Python
使用npy转image图像并保存的实例
Jul 01 Python
python3代码中实现加法重载的实例
Dec 03 Python
只用40行Python代码就能写出pdf转word小工具
May 31 Python
Python之基础函数案例详解
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 array_map()数组函数使用说明
2011/07/12 PHP
php变量范围介绍
2012/10/15 PHP
php 获取本地IP代码
2013/06/23 PHP
ThinkPHP整合百度Ueditor图文教程
2014/10/21 PHP
PHP文件读取功能的应用实例
2015/05/08 PHP
利用PHP将图片转换成base64编码的实现方法
2016/09/13 PHP
laravel-admin表单提交隐藏一些数据,回调时获取数据的方法
2019/10/08 PHP
麦鸡的TAB切换功能结合了javascript和css
2007/12/17 Javascript
jQuery scroll事件实现监控滚动条分页示例
2014/04/04 Javascript
js动态控制table的tr、td增加及删除的具体实现
2014/04/30 Javascript
js实现Select列表内容自动滚动效果代码
2015/08/20 Javascript
详解网站中图片日常使用以及优化手法
2017/01/09 Javascript
jquery实时获取时间的简单实例
2017/01/26 Javascript
JS实现的检验身份证格式并输出出生日期,年龄,性别,出生地示例
2019/05/17 Javascript
使用Vue-Awesome-Swiper实现旋转叠加轮播效果&平移轮播效果
2019/08/16 Javascript
js判断在哪个浏览器打开项目的方法
2020/01/21 Javascript
html中创建并调用vue组件的几种方法汇总
2020/11/17 Javascript
[01:23]一分钟告诉你 DOTA2为什么叫信仰2
2014/06/20 DOTA
[50:04]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第二局
2016/02/28 DOTA
[15:07]lgd_OG_m2_BP
2019/09/10 DOTA
Python3搜索及替换文件中文本的方法
2015/05/22 Python
python抽取指定url页面的title方法
2018/05/11 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
2019/08/12 Python
Python如何使用vars返回对象的属性列表
2020/10/17 Python
MATCHESFASHION澳大利亚/亚太地区:英国时尚奢侈品电商
2020/01/14 全球购物
同学会邀请书大全
2014/01/12 职场文书
个人自我评价范文
2014/02/05 职场文书
《难忘的泼水节》教学反思
2014/02/27 职场文书
运动会开幕式主持词
2014/03/28 职场文书
电子商务专业求职信
2014/07/10 职场文书
工程部主管岗位职责
2015/02/12 职场文书
处罚决定书范文
2015/06/24 职场文书
初三毕业感言
2015/07/31 职场文书
煤矿安全生产工作总结
2015/08/13 职场文书
银行柜员工作心得体会
2016/01/23 职场文书
创业计划书之水果店
2019/07/18 职场文书