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中的关键字“with”与上下文管理器
Apr 21 Python
今天 平安夜 Python 送你一顶圣诞帽 @微信官方
Dec 25 Python
python pandas中对Series数据进行轴向连接的实例
Jun 08 Python
TensorFlow实现Logistic回归
Sep 07 Python
python创建文件备份的脚本
Sep 11 Python
Python 最大概率法进行汉语切分的方法
Dec 14 Python
python numpy 常用随机数的产生方法的实现
Aug 21 Python
python列表推导式入门学习解析
Dec 02 Python
Python解释器及PyCharm工具安装过程
Feb 26 Python
Python多线程threading join和守护线程setDeamon原理详解
Mar 18 Python
关于Python3爬虫利器Appium的安装步骤
Jul 29 Python
Python中的变量与常量
Nov 11 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中计算时间差的几种方法
2009/12/31 PHP
php 上一篇,下一篇文章实现代码与原理说明
2010/05/09 PHP
在php中判断一个请求是ajax请求还是普通请求的方法
2011/06/28 PHP
PHP 与 UTF-8 的最佳实践详细介绍
2017/01/04 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
PDO::getAvailableDrivers讲解
2019/01/28 PHP
document.body.scrollTop 值总为0的解决方法 比较常见的标准问题
2009/11/30 Javascript
Jquery显示和隐藏元素或设为只读(含Ligerui的控件禁用,实例说明介绍)
2013/07/09 Javascript
nodejs读取memcache示例分享
2014/01/02 NodeJs
不同编码的页面表单数据乱码问题解决方法
2015/02/15 Javascript
JS实用技巧小结(屏蔽错误、div滚动条设置、背景图片位置等)
2016/06/16 Javascript
jQuery EasyUI提交表单验证
2016/07/19 Javascript
JS基于正则实现数字千分位用逗号分隔的方法
2017/06/16 Javascript
Angular搜索场景中使用rxjs的操作符处理思路
2018/05/30 Javascript
使用puppeteer爬取网站并抓出404无效链接
2018/12/20 Javascript
JS异步处理的进化史深入讲解
2019/08/25 Javascript
Vue.js标签页组件使用方法详解
2019/10/19 Javascript
Python fileinput模块使用介绍
2014/11/30 Python
python循环监控远程端口的方法
2015/03/14 Python
浅谈pandas用groupby后对层级索引levels的处理方法
2018/11/06 Python
在python中使用requests 模拟浏览器发送请求数据的方法
2018/12/26 Python
python让函数不返回结果的方法
2020/06/22 Python
解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题
2020/07/13 Python
把Anaconda中的环境导入到Pycharm里面的方法步骤
2020/10/30 Python
html5的canvas方法使用指南
2014/12/15 HTML / CSS
世界上第一个水枕头:Mediflow
2018/12/06 全球购物
党员创先争优心得体会
2014/09/11 职场文书
法人代表身份证明书及授权委托书
2014/09/16 职场文书
2015年国际护士节演讲稿
2015/03/18 职场文书
公司仓管员岗位职责
2015/04/01 职场文书
廉洁自律证明
2015/06/24 职场文书
学习十八大的感悟
2015/08/11 职场文书
保护环境建议书作文500字
2015/09/14 职场文书
银行中层干部培训心得体会
2016/01/11 职场文书
一文搞懂Golang 时间和日期相关函数
2021/12/06 Golang
修改Nginx配置返回指定content-type的方法
2022/09/23 Servers