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中使用swapCase()方法转换大小写的教程
May 20 Python
python中import学习备忘笔记
Jan 24 Python
Python模拟脉冲星伪信号频率实例代码
Jan 03 Python
python字符串的方法与操作大全
Jan 30 Python
Python机器学习算法之k均值聚类(k-means)
Feb 23 Python
Python散点图与折线图绘制过程解析
Nov 30 Python
MNIST数据集转化为二维图片的实现示例
Jan 10 Python
手把手教你安装Windows版本的Tensorflow
Mar 26 Python
django实现模型字段动态choice的操作
Apr 01 Python
如何使用python-opencv批量生成带噪点噪线的数字验证码
Dec 21 Python
python中time.ctime()实例用法
Feb 03 Python
python学习之使用Matplotlib画实时的动态折线图的示例代码
Feb 25 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 HTML JavaScript MySQL代码如何互相传值的方法分享
2012/09/30 PHP
使用PHP curl模拟浏览器抓取网站信息
2013/10/28 PHP
采用thinkphp自带方法生成静态html文件详解
2014/06/13 PHP
PHP水印类,支持添加图片、文字、填充颜色区域的实现
2017/02/04 PHP
将Datatable转化成json发送前台实现思路
2013/09/06 Javascript
JQuery实现绚丽的横向下拉菜单
2013/12/19 Javascript
使用JavaScript链式编程实现模拟Jquery函数
2014/12/21 Javascript
jQuery表单域选择器用法分析
2015/02/10 Javascript
javascript事件委托的方式绑定详解
2015/06/10 Javascript
Jqgrid之强大的表格插件应用
2015/12/02 Javascript
javascript加减乘除的简单实例
2016/07/12 Javascript
javascript this详细介绍
2016/09/19 Javascript
详谈js中数组(array)和对象(object)的区别
2017/02/27 Javascript
利用ES6实现单例模式及其应用详解
2017/12/09 Javascript
MVVM框架下实现分页功能示例
2018/06/14 Javascript
分享vue里swiper的一些坑
2018/08/30 Javascript
vue+node实现图片上传及预览的示例方法
2018/11/22 Javascript
Vue项目部署在Spring Boot出现页面空白问题的解决方案
2018/11/26 Javascript
深入了解query和params的使用区别
2019/06/24 Javascript
[06:24]DOTA2 2015国际邀请赛中国区预选赛第二日TOP10
2015/05/27 DOTA
详解Python中映射类型的内建函数和工厂函数
2015/08/19 Python
CentOS 7下安装Python 3.5并与Python2.7兼容并存详解
2017/07/07 Python
Python实现注册登录系统
2017/08/08 Python
利用python GDAL库读写geotiff格式的遥感影像方法
2018/11/29 Python
python实现DEM数据的阴影生成的方法
2019/07/23 Python
Python内置函数locals和globals对比
2020/04/28 Python
分布式全文检索引擎ElasticSearch原理及使用实例
2020/11/14 Python
详解Open Folder as PyCharm Project怎么添加的方法
2020/12/29 Python
日本最大级玩偶手办购物:あみあみ Amiami
2018/04/23 全球购物
Antler英国官网:购买安特丽行李箱、拉杆箱
2019/08/25 全球购物
客房主管岗位职责
2013/12/09 职场文书
工程建设实施方案
2014/03/14 职场文书
学生请假条
2014/04/11 职场文书
学校学雷锋活动总结
2014/06/26 职场文书
反对四风问题自我剖析材料
2014/09/29 职场文书
永中文档在线转换预览基于nginx配置部署方案
2022/06/10 Servers