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(Tornado)模拟登录小米抢手机
Nov 12 Python
Python3 循环语句(for、while、break、range等)
Nov 20 Python
python机器学习案例教程——K最近邻算法的实现
Dec 28 Python
基于wxPython的GUI实现输入对话框(2)
Feb 27 Python
我用Python抓取了7000 多本电子书案例详解
Mar 25 Python
Python将json文件写入ES数据库的方法
Apr 10 Python
python实现修改固定模式的字符串内容操作示例
Dec 30 Python
Django单元测试中Fixtures的使用方法
Feb 26 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
Feb 28 Python
解决import tensorflow as tf 出错的原因
Apr 16 Python
python 实现读取csv数据,分类求和 再写进 csv
May 18 Python
基于Python绘制美观动态圆环图、饼图
Jun 03 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
轻松入门: 煮好咖啡的七个诀窍
2021/03/03 冲泡冲煮
PHP调用MySQL的存储过程的实现代码
2008/08/12 PHP
php引用计数器进行垃圾收集机制介绍
2012/09/19 PHP
基于PHP技术开发客服工单系统
2016/01/06 PHP
非常实用的php验证码类
2016/05/15 PHP
基于PHPexecl类生成复杂的报表表头示例
2016/10/14 PHP
php简单计算年龄的方法(周岁与虚岁)
2016/12/06 PHP
php实现网页上一页下一页翻页过程详解
2019/06/28 PHP
解决php扩展安装不生效问题
2019/10/25 PHP
php中try catch捕获异常实例详解
2020/08/06 PHP
jQuery 处理表单元素的代码
2010/02/15 Javascript
node.js中Socket.IO的进阶使用技巧
2014/11/04 Javascript
JS组件Bootstrap Table表格多行拖拽效果实现代码
2015/12/08 Javascript
新手vue构建单页面应用实例代码
2017/09/18 Javascript
Vue组件通信的四种方式汇总
2018/02/08 Javascript
Bootbox将后台JSON数据填充Form表单的实例代码
2018/09/10 Javascript
jQuery实现图片下载代码
2019/07/18 jQuery
js获取本日、本周、本月的时间代码
2020/02/01 Javascript
python登录pop3邮件服务器接收邮件的方法
2015/04/30 Python
python实现将英文单词表示的数字转换成阿拉伯数字的方法
2015/07/02 Python
win10环境下python3.5安装步骤图文教程
2017/02/03 Python
python+matplotlib实现礼盒柱状图实例代码
2018/01/16 Python
Request的中断和ErrorHandler实例解析
2018/02/12 Python
Python Flask前后端Ajax交互的方法示例
2018/07/31 Python
关于Pycharm无法debug问题的总结
2019/01/19 Python
python3正则提取字符串里的中文实例
2019/01/31 Python
css3中less实现文字长阴影(long shadow)
2020/04/24 HTML / CSS
英国在线购买马术服装:EQUUS
2019/07/12 全球购物
社区中秋节活动方案
2014/01/29 职场文书
2014年六一儿童节演讲稿
2014/05/23 职场文书
2014年小学国庆节活动方案
2014/09/16 职场文书
2015年健康教育工作总结
2015/04/10 职场文书
迎新生晚会主持词
2015/06/30 职场文书
《秋天的怀念》教学反思
2016/02/17 职场文书
html+css 实现简易导航栏功能
2021/04/07 HTML / CSS
浅谈PostgreSQL表分区的三种方式
2021/06/29 PostgreSQL