Django中Middleware中的函数详解


Posted in Python onJuly 18, 2019

一个middleware的例子

import time

from django.urls import reverse
from django.utils.deprecation import MiddlewareMixin


class TimeItMiddleware(MiddlewareMixin):
  def process_request(self, request):
    return

  def process_view(self, request, func, *args, **kwargs):
    if request.path != reverse('index'):
      return None

    start = time.time()
    response = func(request)
    costed = time.time() - start
    print('process view: {:.2f}s'.format(costed))
    return response

  def process_excepttion(self, request, exception):
    pass

  def process_template_response(self, request, response):
    return response

  def process_response(self, request, response):
    return response

middleware中的函数有:

  • process_request
  • process_view
  • process_tmplate_response
  • process_response
  • process_exception

下面分别进行介绍:

process_request:

这是请求来到 middleware 中时讲入的第一个方法。一般情优下,我们以在这里做一些校验,比如用户登录或者 HTTP 中是否有认证头之类的验证.这个方法可以有两种返回值 HttpResnonse 或者None,如果返回 HttpResponse,那么接下米的处理方法只会执行 process_response,其他方法将不会被执行。这里需要注意的是,如果你的 middleware 是 settings 配置的 MIDDLEWARE 的第一个,那么剩下的 middleware 也不会被执行;如果返回 None,那么 Diango会继续执行其他方法。

process_view:

这个方法是在 process_request 方法之后执行的,参数如上面代码所示,其中 func 就是我们将要执行的 view 方法。因此,如果要统计一个view的执行时间,可以在这里做。它的返回值跟 process_request 一样,是HttpResponse 或者 None,其逻辑也一样。如果返回 None,那么 Django 会帮你执行 view 函数,从而得到最终的 response。

Process_template_response:

执行完上面的方法,并且 Django 帮我们执行完 view,拿到最终的 response 后,如果使用了模板的 response (这是指通过 return render(request,'index.html',context={})方式返回的 response),就会来到这个方法中。 在这个方法中,我们可以对 response 做一下操作,比如 Content-Type 设置,或者其他 header 的修改/增加。

process_response:

当所有流程都处理完毕后,就来到了这个方法。这个方法的逻辑跟 process_template_response是完全一样的,只是后者是针对带有模板的response的处理。

process_exception:

上面的处理方法是按顺序介绍的,而这个方法不太一样。只有在发生异常时,才会进入这个方法。哪个阶段发生的异常呢?

可以简单理解为在将要调用的 View 中出现异常(就是在process_view 的 func 函数中)或者返回的模板 response 在渲染时发生的异常。但是需要注意的是,如果你在process_view 中手动调用了 func,就像我们上面做的那样,就不会触发 process_exception 了。这个方法接收到异常之后,可以选择处理异常,然后返回一个含有异常信息的 HttpResponse,或者直接返回 None 不处理,这种情况下 Django会使用自己的异常模板。

以上节选自《Django企业开发实战》 胡阳著。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python常用web框架简单性能测试结果分享(包含django、flask、bottle、tornado)
Aug 25 Python
python基础教程之基本数据类型和变量声明介绍
Aug 29 Python
python中self原理实例分析
Apr 30 Python
Python程序运行原理图文解析
Feb 10 Python
Python定义二叉树及4种遍历方法实例详解
Jul 05 Python
让代码变得更易维护的7个Python库
Oct 09 Python
python实现生成字符串大小写字母和数字的各种组合
Jan 01 Python
python实现生成Word、docx文件的方法分析
Aug 30 Python
使用python实现画AR模型时序图
Nov 20 Python
用python进行视频剪辑
Nov 02 Python
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
Jun 11 Python
python的netCDF4批量处理NC格式文件的操作方法
Mar 21 Python
对DJango视图(views)和模版(templates)的使用详解
Jul 17 #Python
react+django清除浏览器缓存的几种方法小结
Jul 17 #Python
在Pycharm中调试Django项目程序的操作方法
Jul 17 #Python
在Django model中设置多个字段联合唯一约束的实例
Jul 17 #Python
对django views中 request, response的常用操作详解
Jul 17 #Python
python自带tkinter库实现棋盘覆盖图形界面
Jul 17 #Python
python递归法解决棋盘分割问题
Jul 17 #Python
You might like
mongo Table类文件 获取MongoCursor(游标)的实现方法分析
2013/07/01 PHP
thinkphp的静态缓存用法分析
2014/11/29 PHP
PHP如何通过AJAX方式实现登录功能
2015/11/23 PHP
PHP dirname(__FILE__)原理及用法解析
2020/10/28 PHP
jQuery 操作XML入门
2008/12/25 Javascript
js Array对象的扩展函数代码
2013/04/24 Javascript
按下回车键指向下一个位置的一个函数代码
2014/03/10 Javascript
JQuery查找DOM节点的方法
2015/06/11 Javascript
js实现鼠标点击文本框自动选中内容的方法
2015/08/20 Javascript
TinyMCE汉化及本地上传图片功能实例详解
2016/05/31 Javascript
js实现精确到毫秒的倒计时效果
2016/08/05 Javascript
原生js实现选项卡功能
2017/03/08 Javascript
Bootstrap 网格系统布局详解
2017/03/19 Javascript
jQuery实现字体颜色渐变效果的方法
2017/03/29 jQuery
JS获取子、父、兄节点方法小结
2017/08/14 Javascript
Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解
2017/09/25 Javascript
vue中上传视频或图片或图片和文字一起到后端的解决方法
2019/12/01 Javascript
JavaScript对象原型链原理详解
2020/02/05 Javascript
javascript设计模式 ? 简单工厂模式原理与应用实例分析
2020/04/09 Javascript
收集的几个Python小技巧分享
2014/11/22 Python
Python使用time模块实现指定时间触发器示例
2017/05/18 Python
Python逐行读取文件中内容的简单方法
2019/02/26 Python
详解Django+uwsgi+Nginx上线最佳实战
2019/03/14 Python
python 密码学示例——理解哈希(Hash)算法
2020/09/21 Python
html5 canvas简单封装一个echarts实现不了的饼图
2018/06/12 HTML / CSS
美国时尚女装在线:Missguided
2016/12/03 全球购物
澳洲女装时尚在线:Blue Bungalow
2018/05/05 全球购物
英国邮购活的植物主要供应商:Gardening Direct
2019/01/28 全球购物
优秀中学生事迹材料
2014/01/31 职场文书
党员政治学习材料
2014/05/14 职场文书
政协调研汇报材料
2014/08/15 职场文书
五一劳动节演讲稿
2014/09/12 职场文书
优秀班主任工作总结2015
2015/05/25 职场文书
幼儿园开学温馨提示
2015/07/15 职场文书
python字符串的多行输出的实例详解
2021/06/08 Python
Python Pandas常用函数方法总结
2021/06/15 Python