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 09 Python
Python切片知识解析
Mar 06 Python
python 数据的清理行为实例详解
Jul 12 Python
Python爬虫实例扒取2345天气预报
Mar 04 Python
python实现微信自动回复机器人功能
Jul 11 Python
py-charm延长试用期限实例
Dec 22 Python
Python写出新冠状病毒确诊人数地图的方法
Feb 12 Python
python实现PCA降维的示例详解
Feb 24 Python
Python代码中如何读取键盘录入的值
May 27 Python
解决python pandas读取excel中多个不同sheet表格存在的问题
Jul 14 Python
Python设计密码强度校验程序
Jul 30 Python
python 实现的截屏工具
May 08 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
Windows2003 下 MySQL 数据库每天自动备份
2006/12/21 PHP
PHP实现读取一个1G的文件大小
2013/08/24 PHP
thinkphp3.x自定义Action、Model及View的简单实现方法
2016/05/19 PHP
php使用str_replace替换多维数组的实现方法分析
2017/06/15 PHP
PDO::setAttribute讲解
2019/01/29 PHP
出现“不能执行已释放的Script代码”错误的原因及解决办法
2007/08/29 Javascript
javascript 写类方式之六
2009/07/05 Javascript
jquery之empty()与remove()区别说明
2010/09/10 Javascript
移动端JQ插件hammer使用详解
2015/07/03 Javascript
JavaScript文档碎片操作实例分析
2015/12/12 Javascript
jQuery配合coin-slider插件制作幻灯片效果的流程解析
2016/05/13 Javascript
详解js的事件处理函数和动态创建html标记方法
2016/12/16 Javascript
js实现一键复制功能
2017/03/16 Javascript
通过Kettle自定义jar包供javascript使用
2020/01/29 Javascript
微信小程序实现弹框效果
2020/05/26 Javascript
[03:19]2016国际邀请赛中国区预选赛第四日TOP10镜头集锦
2016/07/01 DOTA
[01:03:41]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第一场 12.17
2020/12/19 DOTA
Python机器学习之SVM支持向量机
2017/12/27 Python
Python3结合Dlib实现人脸识别和剪切
2018/01/24 Python
Python中optparser库用法实例详解
2018/01/26 Python
Python中的取模运算方法
2018/11/10 Python
python爬取内容存入Excel实例
2019/02/20 Python
基于python实现的百度新歌榜、热歌榜下载器(附代码)
2019/08/05 Python
Python中的 ansible 动态Inventory 脚本
2020/01/19 Python
PyQt5的相对布局管理的实现
2020/08/07 Python
荷兰包包购物网站:The Little Green Bag
2018/03/17 全球购物
新郎父亲婚宴答谢词
2014/01/11 职场文书
设计顾问服务计划书
2014/05/04 职场文书
村班子对照检查材料
2014/08/18 职场文书
开展批评与自我批评心得体会
2014/10/17 职场文书
2014最新自愿离婚协议书范本
2014/11/19 职场文书
新婚姻法离婚协议书范文
2014/11/30 职场文书
单身申明具结书
2015/02/26 职场文书
Python 数据可视化神器Pyecharts绘制图像练习
2022/02/28 Python
分享7个 Python 实战项目练习
2022/03/03 Python
解决redis批量删除key值的问题
2022/03/23 Redis