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控制台英汉汉英电子词典
Apr 23 Python
Python实现单词拼写检查
Apr 25 Python
Python实现SVN的目录周期性备份实例
Jul 17 Python
python开发之for循环操作实例详解
Nov 12 Python
PyCharm 常用快捷键和设置方法
Dec 20 Python
Python入门之后再看点什么好?
Mar 05 Python
Python 常用模块 re 使用方法详解
Jun 06 Python
利用matplotlib实现根据实时数据动态更新图形
Dec 13 Python
Python3.5 win10环境下导入kera/tensorflow报错的解决方法
Dec 19 Python
解决pyCharm中 module 调用失败的问题
Feb 12 Python
python实现处理mysql结果输出方式
Apr 09 Python
python lambda 表达式形式分析
Apr 03 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
将文件夹压缩成zip文件的php代码
2009/12/14 PHP
php求今天、昨天、明天时间戳的简单实现方法
2016/07/28 PHP
js中继承的几种用法总结(apply,call,prototype)
2013/12/26 Javascript
JS简单操作select和dropdownlist实例
2014/11/26 Javascript
浅析javascript操作 cookie对象
2014/12/26 Javascript
jquery移动点击的项目到列表最顶端的方法
2015/06/24 Javascript
jquery实现可关闭的倒计时广告特效代码
2015/09/02 Javascript
jQuery使用经验小技巧(推荐)
2016/05/31 Javascript
jQuery 常见小例汇总
2016/12/14 Javascript
angularjs点击图片放大实现上传图片预览
2017/02/24 Javascript
详解如何将angular-ui的图片轮播组件封装成一个指令
2017/05/09 Javascript
JS简单实现点击跳转登陆邮箱功能的方法
2017/10/31 Javascript
javascript性能优化之分时函数的介绍
2018/03/28 Javascript
浅析java线程中断的办法
2018/07/29 Javascript
小程序登录态管理的方法示例
2018/11/13 Javascript
vue.js实现简单的计算器功能
2020/02/22 Javascript
闭包在python中的应用之translate和maketrans用法详解
2014/08/27 Python
Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法
2018/01/11 Python
Python内置模块hashlib、hmac与uuid用法分析
2018/02/12 Python
python_mask_array的用法
2020/02/18 Python
python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法
2020/02/26 Python
python 双循环遍历list 变量判断代码
2020/05/04 Python
tensorflow从ckpt和从.pb文件读取变量的值方式
2020/05/26 Python
Python与C/C++的相互调用案例
2021/03/04 Python
抽象方法、抽象类怎样声明
2014/10/25 面试题
如何将无状态会话Bean发布为WEB服务,只有无状态会话Bean可以发布为WEB服务?
2015/12/03 面试题
菜篮子工程实施方案
2014/03/08 职场文书
学习方法演讲稿
2014/05/10 职场文书
党员自我评价2015
2015/03/03 职场文书
职位证明模板
2015/06/23 职场文书
运动会5000米加油稿
2015/07/21 职场文书
python 机器学习的标准化、归一化、正则化、离散化和白化
2021/04/16 Python
Python函数式编程中itertools模块详解
2021/09/15 Python
Python+Tkinter制作专属图形化界面
2022/04/01 Python
星际争霸:毕姥爷vs解冻03
2022/04/01 星际争霸
mysql使用instr达到in(字符串)的效果
2022/04/03 MySQL