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 相关文章推荐
Windows下Python的Django框架环境部署及应用编写入门
Mar 10 Python
python简单线程和协程学习心得(分享)
Jun 14 Python
Python读写/追加excel文件Demo分享
May 03 Python
python3实现字符串的全排列的方法(无重复字符)
Jul 07 Python
Python实现iOS自动化打包详解步骤
Oct 03 Python
Django渲染Markdown文章目录的方法示例
Jan 02 Python
Django自定义模板过滤器和标签的实现方法
Aug 21 Python
python实现tail实时查看服务器日志示例
Dec 24 Python
Python re正则表达式元字符分组()用法分享
Feb 10 Python
Python使用configparser库读取配置文件
Feb 22 Python
Python关键字及可变参数*args,**kw原理解析
Apr 04 Python
用Python自动清理电脑内重复文件,只要10行代码(自动脚本)
Jan 09 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
逆序二维数组插入一元素的php代码
2012/06/08 PHP
PHP函数addslashes和mysql_real_escape_string的区别
2014/04/22 PHP
php遍历删除整个目录及文件的方法
2015/03/13 PHP
php post json参数的传递和接收处理方法
2018/05/31 PHP
php微信开发之关注事件
2018/06/14 PHP
40个有创意的jQuery图片、内容滑动及弹出插件收藏集之一
2011/12/31 Javascript
网页加载时页面显示进度条加载完成之后显示网页内容
2012/12/23 Javascript
JS复制到剪贴板示例代码
2013/10/30 Javascript
关于cookie的初识和运用(js和jq)
2016/04/07 Javascript
JavaScript函数柯里化原理与用法分析
2017/03/31 Javascript
jquery实现简单实用的轮播器
2017/05/23 jQuery
详解angularjs的数组传参方式的简单实现
2017/07/28 Javascript
解决Angular.js中使用Swiper插件不能滑动的问题
2018/02/26 Javascript
Canvas实现微信红包照片效果
2018/08/21 Javascript
Vue实现远程获取路由与页面刷新导致404错误的解决
2019/01/31 Javascript
浅谈Node 异步IO和事件循环
2019/05/05 Javascript
nodejs nedb 封装库与使用方法示例
2020/02/06 NodeJs
Vue项目vscode 安装eslint插件的方法(代码自动修复)
2020/04/15 Javascript
JavaScript使用prototype属性实现继承操作示例
2020/05/22 Javascript
javascript实现简单留言板案例
2021/02/09 Javascript
[03:59]DOTA2英雄梦之声_第07期_水晶室女
2014/06/23 DOTA
[04:40]2016个国际邀请赛中国区预选赛场地——华西村观战指南
2016/06/25 DOTA
django 2.0更新的10条注意事项总结
2018/01/05 Python
python把数组中的数字每行打印3个并保存在文档中的方法
2018/07/17 Python
python使用插值法画出平滑曲线
2018/12/15 Python
python numpy 常用随机数的产生方法的实现
2019/08/21 Python
Python logging设置和logger解析
2019/08/28 Python
python同步windows和linux文件
2019/08/29 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
2019/09/04 Python
Pyspark读取parquet数据过程解析
2020/03/27 Python
Python Tkinter实例——模拟掷骰子
2020/10/24 Python
美国内衣品牌:Leonisa
2016/08/14 全球购物
澳大利亚领先的孕妇服装品牌:Mamaway
2018/08/14 全球购物
医院总经理岗位职责
2014/02/04 职场文书
三好学生个人先进事迹材料
2014/05/17 职场文书
政府采购方案
2014/06/12 职场文书