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计算最小优先级队列代码分享
Dec 18 Python
Python中input与raw_input 之间的比较
Aug 20 Python
python和ruby,我选谁?
Sep 13 Python
python斐波那契数列的计算方法
Sep 27 Python
Python中new方法的详解
Jan 15 Python
Python魔法方法详解
Feb 13 Python
基于sklearn实现Bagging算法(python)
Jul 11 Python
python打包成so文件过程解析
Sep 28 Python
Python使用gluon/mxnet模块实现的mnist手写数字识别功能完整示例
Dec 18 Python
jenkins+python自动化测试持续集成教程
May 12 Python
django教程如何自学
Jul 31 Python
浅析python实现动态规划背包问题
Dec 31 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中选择什么接口(mysql、mysqli)访问mysql
2013/02/06 PHP
PHP排序算法之快速排序(Quick Sort)及其优化算法详解
2018/04/21 PHP
php实现每日签到功能
2018/11/29 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
W3C Group的JavaScript1.8 新特性介绍
2009/05/19 Javascript
javascript 三种编解码方式
2010/02/01 Javascript
Pro JavaScript Techniques学习笔记
2010/12/28 Javascript
js列举css中所有图标的实现代码
2011/07/04 Javascript
JavaScript 异常处理 详解
2015/02/06 Javascript
js实现发送验证码后的倒计时功能
2015/05/28 Javascript
jQuery实现图片滑动效果
2017/03/08 Javascript
JavaScript 数据类型详解
2017/03/13 Javascript
深入对Vue.js $watch方法的理解
2017/03/20 Javascript
Nodejs进阶:express+session实现简易登录身份认证
2017/04/24 NodeJs
详解vue 单页应用(spa)前端路由实现原理
2018/04/04 Javascript
vue多层嵌套路由实例分析
2019/03/19 Javascript
vue实现多个echarts根据屏幕大小变化而变化实例
2020/07/19 Javascript
js+css3实现炫酷时钟
2020/08/18 Javascript
Python的Django框架中的Context使用
2015/07/15 Python
python 线程的暂停, 恢复, 退出详解及实例
2016/12/06 Python
下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决
2018/04/23 Python
Python中logging实例讲解
2019/01/17 Python
python 利用pandas将arff文件转csv文件的方法
2019/02/12 Python
详解有关PyCharm安装库失败的问题的解决方法
2020/02/02 Python
新手学python应该下哪个版本
2020/06/11 Python
Python中logger日志模块详解
2020/08/04 Python
关于python scrapy中添加cookie踩坑记录
2020/11/17 Python
使用BeautifulSoup4解析XML的方法小结
2020/12/07 Python
使用phonegap进行提示操作的具体方法
2017/03/30 HTML / CSS
美国大型的健身社区和补充商店:Bodybuilding.com
2016/09/06 全球购物
澳大利亚体育和露营装备在线/实体零售商:Find Sports
2020/06/03 全球购物
导游词400字
2015/02/13 职场文书
岁月神偷观后感
2015/06/11 职场文书
运动会开幕式新闻稿
2015/07/17 职场文书
2016年小学生新年寄语
2015/08/18 职场文书
Vscode中SSH插件如何远程连接Linux
2022/05/02 Servers