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 相关文章推荐
linux下安装easy_install的方法
Feb 10 Python
跟老齐学Python之类的细节
Oct 13 Python
python实现模拟按键,自动翻页看u17漫画
Mar 17 Python
Python中的choice()方法使用详解
May 15 Python
Python实现SVN的目录周期性备份实例
Jul 17 Python
在Python的Django框架中使用通用视图的方法
Jul 21 Python
python opencv 二值化 计算白色像素点的实例
Jul 03 Python
python数据处理之如何选取csv文件中某几行的数据
Sep 02 Python
Python3将jpg转为pdf文件的方法示例
Dec 13 Python
使用Tensorflow实现可视化中间层和卷积层
Jan 24 Python
python实现逻辑回归的示例
Oct 09 Python
python模块内置属性概念及实例
Feb 18 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 服务器调试 Zend Debugger 的安装教程
2009/09/25 PHP
Laravel 自定命令以及生成文件的例子
2019/10/23 PHP
JAVASCRIPT对象及属性
2007/02/13 Javascript
JavaScript Date对象使用总结
2009/05/14 Javascript
javascript插入样式实现代码
2012/02/22 Javascript
jquery入门—编写一个导航条(可伸缩)
2013/01/07 Javascript
js简单实现表单中点击按钮动态增加输入框数量的方法
2015/08/18 Javascript
jQuery针对input的class属性写了多个值情况下的选择方法
2016/06/03 Javascript
详解如何在NodeJS项目中优雅的使用ES6
2017/04/22 NodeJs
js编写简单的计时器功能
2017/07/15 Javascript
Three.js利用顶点绘制立方体的方法详解
2017/09/27 Javascript
详解vue-admin和后端(flask)分离结合的例子
2018/02/12 Javascript
vue element-ui table表格滚动加载方法
2018/03/02 Javascript
vue实现提示保存后退出的方法
2018/03/15 Javascript
Vue实现一个无限加载列表功能
2018/11/13 Javascript
jQuery选择器之基本过滤选择器用法实例分析
2019/02/19 jQuery
ES6学习笔记之字符串、数组、对象、函数新增知识点实例分析
2020/01/22 Javascript
vue中父子组件传值,解决钩子函数mounted只运行一次的操作
2020/07/27 Javascript
JQuery绑定事件四种实现方法解析
2020/12/02 jQuery
python中实现定制类的特殊方法总结
2014/09/28 Python
Python单例模式实例分析
2015/01/14 Python
python实现画一颗树和一片森林
2018/06/25 Python
对python中GUI,Label和Button的实例详解
2019/06/27 Python
在cmd中查看python的安装路径方法
2019/07/03 Python
python selenium自动化测试框架搭建的方法步骤
2020/06/14 Python
Python request中文乱码问题解决方案
2020/09/17 Python
豆腐の盛田屋官网:日本自然派的豆乳面膜、肥皂、化妆水、乳液等
2016/10/08 全球购物
Redbubble法国:由独立艺术家设计的独特产品
2019/01/08 全球购物
资料员的岗位职责
2013/11/20 职场文书
网络工程专业大学生求职信
2014/10/01 职场文书
组织生活会表态发言材料
2014/10/17 职场文书
小学教师年度个人总结
2015/02/05 职场文书
学生逃课万能检讨书2000字
2015/02/17 职场文书
2015中秋节慰问信范文
2015/03/23 职场文书
CSS+HTML 实现顶部导航栏功能
2021/08/30 HTML / CSS
零基础学java之带参数以及返回值的方法
2022/04/10 Java/Android