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 05 Python
python用户管理系统的实例讲解
Dec 23 Python
基于并发服务器几种实现方法(总结)
Dec 29 Python
Python微信公众号开发平台
Jan 25 Python
Python cookbook(数据结构与算法)将序列分解为单独变量的方法
Feb 13 Python
Python使用xlwt模块操作Excel的方法详解
Mar 27 Python
Python多继承顺序实例分析
May 26 Python
python使用turtle库绘制时钟
Mar 25 Python
python实现列表中由数值查到索引的方法
Jun 27 Python
详解Python最长公共子串和最长公共子序列的实现
Jul 07 Python
python3利用venv配置虚拟环境及过程中的小问题小结
Aug 01 Python
Python Pandas实现数据分组求平均值并填充nan的示例
Jul 04 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
example2.php
2006/10/09 PHP
PHP基于反射机制实现插件的可插拔设计详解
2016/11/10 PHP
php实现的顺序线性表示例
2019/05/04 PHP
获取URL地址中的文件名和参数的javascript代码
2009/09/02 Javascript
Jquery选择器 $实现原理
2009/12/02 Javascript
JQuery的自定义事件代码,触发,绑定简单实例
2013/08/01 Javascript
Jquery 的outerHeight方法使用介绍
2013/09/11 Javascript
javascript数据类型示例分享
2015/01/19 Javascript
js实现网页右上角滑出会自动消失大幅广告的方法
2015/02/27 Javascript
AngularJS实现Model缓存的方式
2016/02/03 Javascript
jQuery组件easyui对话框实现代码
2016/08/25 Javascript
Bootstrap框架结合jQuery仿百度换肤功能实例解析
2016/09/17 Javascript
Vue.js实现实例搜索应用功能详细代码
2017/08/24 Javascript
如何使用less实现随机下雪动画详解
2019/01/02 Javascript
微信小程序全局变量功能与用法详解
2019/01/22 Javascript
小程序如何获取多个formId实现详解
2019/09/20 Javascript
jquery实现购物车基本功能
2019/10/25 jQuery
js实现简单的贪吃蛇游戏
2020/04/23 Javascript
[57:22]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第五场
2018/04/10 DOTA
pandas 对每一列数据进行标准化的方法
2018/06/09 Python
Python matplotlib通过plt.scatter画空心圆标记出特定的点方法
2018/12/13 Python
Django Rest framework之权限的实现示例
2018/12/17 Python
Python正则表达式匹配和提取IP地址
2019/06/06 Python
Python GUI学习之登录系统界面篇
2019/08/21 Python
ubuntu 安装pyqt5和卸载pyQt5的方法
2020/03/24 Python
Pycharm调试程序技巧小结
2020/08/08 Python
CSS3弹性盒模型开发笔记(三)
2016/04/26 HTML / CSS
马来西亚领先的在线礼品店:Giftr
2018/08/23 全球购物
婴儿鞋,独特的婴儿服装和配件:Zutano
2018/11/03 全球购物
英国川宁茶官方网站:Twinings茶
2019/05/21 全球购物
教育学专业毕业生的自我鉴定
2013/11/26 职场文书
高中毕业生自我鉴定例文
2013/12/29 职场文书
十佳文明家庭事迹
2014/05/25 职场文书
考研复习计划
2015/01/19 职场文书
如何书写读后感?(附范文)
2019/07/26 职场文书
mysq启动失败问题及场景分析
2021/07/15 MySQL