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基于正则表达式实现文件内容替换的方法
Aug 30 Python
Python中的浮点数原理与运算分析
Oct 12 Python
Python实现自定义顺序、排列写入数据到Excel的方法
Apr 23 Python
TensorFlow入门使用 tf.train.Saver()保存模型
Apr 24 Python
Python Socket编程之多线程聊天室
Jul 28 Python
Django 内置权限扩展案例详解
Mar 04 Python
Python获取命令实时输出-原样彩色输出并返回输出结果的示例
Jul 11 Python
在Django admin中编辑ManyToManyField的实现方法
Aug 09 Python
python base64库给用户名或密码加密的流程
Jan 02 Python
Python 如何调试程序崩溃错误
Aug 03 Python
详解python3 GUI刷屏器(附源码)
Feb 18 Python
Python selenium的这三种等待方式一定要会!
Jun 10 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
MYSQL 小技巧 -- LAST_INSERT_ID
2009/11/24 PHP
探讨:如何使用PHP实现计算两个日期间隔的年、月、周、日数
2013/06/13 PHP
解析php中heredoc的使用方法
2013/06/17 PHP
PHP内存缓存Memcached类实例
2014/12/08 PHP
PHP-FPM 的管理和配置详解
2019/02/17 PHP
JavaScript修改css样式style
2008/04/15 Javascript
在html中引入外部js文件,并调用带参函数的方法
2016/10/31 Javascript
详解Angular2 关于*ngFor 嵌套循环
2017/05/22 Javascript
JS实现左边列表移到到右边列表功能
2018/03/28 Javascript
Vue中使用vue-i18插件实现多语言切换功能
2018/04/25 Javascript
VUE基于NUXT的SSR 服务端渲染
2018/11/30 Javascript
微信小程序获取用户信息及手机号(后端TP5.0)
2019/09/12 Javascript
利用JS代码自动删除稿件的普通弹幕功能
2019/09/20 Javascript
[51:17]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
在Django的模型中添加自定义方法的示例
2015/07/21 Python
开源软件包和环境管理系统Anaconda的安装使用
2017/09/04 Python
python自动化生成IOS的图标
2018/11/13 Python
Python查找文件中包含中文的行方法
2018/12/19 Python
华为校园招聘上机笔试题 扑克牌大小(python)
2020/04/22 Python
Python利用pip安装tar.gz格式的离线资源包
2020/09/14 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
2020/09/29 Python
一文彻底解决HTML5页面中长按保存图片功能
2019/06/10 HTML / CSS
写好求职信第一句话的技巧
2013/10/26 职场文书
三年级语文教学反思
2014/02/01 职场文书
乡镇消防工作实施方案
2014/03/27 职场文书
纠纷协议书
2014/04/16 职场文书
银行求职信怎么写
2014/05/26 职场文书
护理专业毕业生自荐信
2014/06/15 职场文书
幼儿园迎国庆65周年活动策划方案
2014/09/16 职场文书
领导班子三严三实心得体会
2014/10/13 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
安全生产奖惩制度
2015/08/06 职场文书
2016年基层党支部书记公开承诺书
2016/03/25 职场文书
2016年第16个全民国防教育日宣传活动总结
2016/04/05 职场文书
pytorch锁死在dataloader(训练时卡死)
2021/05/28 Python
tomcat的catalina.out日志按自定义时间格式进行分割的操作方法
2022/04/02 Servers