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类的多重继承问题深入分析
Nov 09 Python
python使用pil生成缩略图的方法
Mar 26 Python
python制作最美应用的爬虫
Oct 28 Python
Tensorflow中使用tfrecord方式读取数据的方法
Jun 19 Python
Python如何发布程序的详细教程
Oct 09 Python
python 监测内存和cpu的使用率实例
Nov 28 Python
CentOS7下安装python3.6.8的教程详解
Jan 03 Python
python实现飞行棋游戏
Feb 05 Python
python实现可下载音乐的音乐播放器
Feb 25 Python
Pytorch框架实现mnist手写库识别(与tensorflow对比)
Jul 20 Python
Python3使用 GitLab API 进行批量合并分支
Oct 15 Python
python多次执行绘制条形图
Apr 20 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
使用php4加速网络传输
2006/10/09 PHP
PHP写的求多项式导数的函数代码
2012/07/04 PHP
详谈PHP程序Laravel 5框架的优化技巧
2016/07/18 PHP
使用PHPWord生成word文档的方法详解
2019/06/06 PHP
Ext JS Grid在IE6 下宽度的问题解决方法
2009/02/15 Javascript
IE6,IE7下js动态加载图片不显示错误
2010/07/17 Javascript
js最简单的拖拽效果实现代码
2010/09/24 Javascript
再论Javascript的类继承
2011/03/05 Javascript
分享精心挑选的23款美轮美奂的jQuery 图片特效插件
2012/08/14 Javascript
wap图片滚动特效无css3元素纯js脚本编写
2014/08/22 Javascript
同一个网页中实现多个JavaScript特效的方法
2015/02/02 Javascript
javascript异步编程代码书写规范Promise学习笔记
2015/02/11 Javascript
基于JS如何实现给字符加千分符(65,541,694,158)
2016/08/03 Javascript
js HTML5上传示例代码完整版
2016/10/10 Javascript
jQuery回调方法使用示例
2017/06/26 jQuery
简单的Vue异步组件实例Demo
2017/12/27 Javascript
angularJs自定义过滤器实现手机号信息隐藏的方法
2018/10/08 Javascript
vue 实现微信浮标效果
2019/09/01 Javascript
JS实现网页时钟特效
2020/03/25 Javascript
微信小程序反编译的实现
2020/12/10 Javascript
基于vue+echarts数据可视化大屏展示的实现
2020/12/25 Vue.js
Django中更新多个对象数据与删除对象的方法
2015/07/17 Python
Python操作Redis之设置key的过期时间实例代码
2018/01/25 Python
对Pandas MultiIndex(多重索引)详解
2018/11/16 Python
如何使用python自带IDLE的几种方法
2020/10/10 Python
canvas压缩图片以及卡片制作的方法示例
2018/12/04 HTML / CSS
摩托车和ATV零件、配件和服装的首选在线零售商:MotoSport
2017/12/22 全球购物
优衣库台湾官网:UNIQLO台湾
2019/02/01 全球购物
土木工程专业推荐信
2014/02/19 职场文书
英文演讲稿
2014/05/15 职场文书
个人剖析材料范文
2014/09/30 职场文书
2014年帮扶工作总结
2014/11/26 职场文书
综合素质评价思想道德自我评价
2015/03/09 职场文书
2016党员学习作风建设心得体会
2016/01/21 职场文书
新手必备Python开发环境搭建教程
2021/05/28 Python
微信小程序scroll-view不能左右滑动问题的解决方法
2021/07/09 Javascript