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编程-将Python程序转化为可执行程序[整理]
Apr 09 Python
记录Django开发心得
Jul 16 Python
Python PyQt5标准对话框用法示例
Aug 23 Python
python交互式图形编程实例(一)
Nov 17 Python
Python 实现网页自动截图的示例讲解
May 17 Python
Python实现的多叉树寻找最短路径算法示例
Jul 30 Python
python实现简单五子棋游戏
Jun 18 Python
Django实现跨域的2种方法
Jul 31 Python
Python 用三行代码提取PDF表格数据
Oct 13 Python
Python 列表的清空方式
Jan 13 Python
Python HTMLTestRunner库安装过程解析
May 25 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
Dec 01 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 session 检测和注销
2009/03/16 PHP
支持中文字母数字、自定义字体php验证码代码
2012/02/27 PHP
php中HTTP_REFERER函数用法实例
2014/11/21 PHP
PHP面向对象程序设计之多态性的应用示例
2018/12/19 PHP
javascript 全角转换实现代码
2009/07/17 Javascript
通过继承IHttpHandle实现JS插件的组织与管理
2010/07/13 Javascript
js获取网页可见区域、正文以及屏幕分辨率的高度
2014/05/15 Javascript
JavaScript的事件代理和委托实例分析
2015/03/25 Javascript
js实现动态加载脚本的方法实例汇总
2015/11/02 Javascript
微信小程序页面间通信的5种方式
2017/03/31 Javascript
nodejs和C语言插入mysql数据库乱码问题的解决方法
2017/04/14 NodeJs
详解React-Native解决键盘遮挡问题(Keyboard遮挡问题)
2017/07/13 Javascript
浅谈ES6新增的数组方法和对象
2017/08/08 Javascript
微信小程序实现的五星评价功能示例
2019/04/25 Javascript
js实现3D粒子酷炫动态旋转特效
2020/09/13 Javascript
TypeScript魔法堂之枚举的超实用手册
2020/10/29 Javascript
[11:57]《一刀刀一天》第十七期:TI中国军团加油!
2014/05/26 DOTA
python中list常用操作实例详解
2015/06/03 Python
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
2016/05/27 Python
使用Python3 编写简单信用卡管理程序
2016/12/21 Python
Collatz 序列、逗号代码、字符图网格实例
2017/06/22 Python
Django进阶之CSRF的解决
2018/08/01 Python
python 定时任务去检测服务器端口是否通的实例
2019/01/26 Python
英国Zoro工具:手动工具,电动工具和个人防护用品
2016/11/02 全球购物
营销总经理的岗位职责
2013/12/15 职场文书
茶叶店创业计划书范文
2014/01/19 职场文书
批评与自我批评材料
2014/02/15 职场文书
领导接待方案
2014/03/13 职场文书
原材料检验岗位职责
2014/03/15 职场文书
父母对孩子的寄语
2014/04/09 职场文书
党员学习中共十八大思想报告
2014/09/12 职场文书
2015年乡镇环保工作总结
2015/04/22 职场文书
儿童诗两首教学反思
2016/02/23 职场文书
解读MySQL的客户端和服务端协议
2021/05/10 MySQL
Python实现列表拼接和去重的三种方式
2021/07/02 Python
详解PyTorch模型保存与加载
2022/04/28 Python