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 相关文章推荐
数据挖掘之Apriori算法详解和Python实现代码分享
Nov 07 Python
Pyhton中单行和多行注释的使用方法及规范
Oct 11 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
May 27 Python
pandas.DataFrame的pivot()和unstack()实现行转列
Jul 06 Python
Python DataFrame一列拆成多列以及一行拆成多行
Aug 06 Python
Django密码存储策略分析
Jan 09 Python
python 实现的车牌识别项目
Jan 25 Python
Python3+Appium安装及Appium模拟微信登录方法详解
Feb 16 Python
Python中使用Selenium环境安装的方法步骤
Feb 22 Python
Python爬取酷狗MP3音频的步骤
Feb 26 Python
Python实现简单的俄罗斯方块游戏
Sep 25 Python
详解Python+OpenCV进行基础的图像操作
Feb 15 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
长波知识介绍
2021/03/01 无线电
PHP 开源AJAX框架14种
2009/08/24 PHP
php 的加密函数 md5,crypt,base64_encode 等使用介绍
2012/04/09 PHP
Zend Framework自定义Helper类相关注意事项总结
2016/03/14 PHP
Yii2框架操作数据库的方法分析【以mysql为例】
2019/05/27 PHP
php把文件设置为插件的技巧方法
2020/02/03 PHP
Firefox 无法获取cssRules 的解决办法
2006/10/11 Javascript
javascript之dhDataGrid Ver2.0.0代码
2007/07/01 Javascript
JavaScript 学习笔记二 字符串拼接
2010/03/28 Javascript
extjs_02_grid显示本地数据、显示跨域数据
2014/06/23 Javascript
Javascript基础教程之for循环
2015/01/18 Javascript
JavaScript中的Promise使用详解
2015/06/24 Javascript
javascript数组随机排序实例分析
2015/07/22 Javascript
node.js cookie-parser之parser.js
2016/06/06 Javascript
js print打印网页指定区域内容的简单实例
2016/11/01 Javascript
JavaScript中使用参数个数实现重载功能
2017/09/01 Javascript
动手写一个angular版本的Message组件的方法
2017/12/16 Javascript
js判断节假日实例代码
2017/12/27 Javascript
脚手架vue-cli工程webpack的基本用法详解
2018/09/29 Javascript
在vue中使用express-mock搭建mock服务的方法
2018/11/07 Javascript
[51:53]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第二场 1月24日
2021/03/11 DOTA
用Python给文本创立向量空间模型的教程
2015/04/23 Python
pytorch三层全连接层实现手写字母识别方式
2020/01/14 Python
PyCharm汉化安装及永久激活详细教程(靠谱)
2020/01/16 Python
20行Python代码实现一款永久免费PDF编辑工具的实现
2020/08/27 Python
俄罗斯第一家多品牌在线奢侈品精品店:Aizel.ru
2020/09/06 全球购物
《灯光》教学反思
2014/02/08 职场文书
《月亮湾》教学反思
2014/04/14 职场文书
汽车专业求职信
2014/06/05 职场文书
一年级小学生评语大全
2014/12/25 职场文书
贷款工作证明模板
2015/06/12 职场文书
高中班主任心得体会
2016/01/07 职场文书
2019升学宴主持词范本5篇
2019/10/09 职场文书
JavaScript架构localStorage特殊场景下二次封装操作
2022/06/21 Javascript
Mysql表数据比较大情况下修改添加字段的方法实例
2022/06/28 MySQL
输入框跟随文字内容适配宽实现示例
2022/08/14 Javascript