理解Django 中Call Stack机制的小Demo


Posted in Python onSeptember 01, 2020

1.工作流程

request/response模式下,request并不是直接到达view方法,view方法也不是将返回的response直接发送给浏览器的,而是request由外到里的层层通过各种middleware层,这个时候可以对request做一些事情,到最后一层也就是最内层时,得到view方法返回的response,然后再把这个response再由内到外层层传递出来,这时候可以对response做一些事情,如下图:

理解Django 中Call Stack机制的小Demo

2.原理

class SimpleMiddleware:
 def __init__(self, get_response):
  self.get_response = get_response
  # One-time configuration and initialization.
 
 def __call__(self, request):
  # Code to be executed for each request before
  # the view (and later middleware) are called.
 
  response = self.get_response(request)
 
  # Code to be executed for each request/response after
  # the view is called.
 
  return response

每个middleware都如上面代码一样,有两个必须的函数:(1)__init__(self,get_response),负责在web server启动时完成初始化,即建立与下一层middleware的联系.(2)__call__(self,request),在每次request下,被调用。

有三个可选的函数:(1)process_view:__init__和__call__对view 方法一无所知,而process_view给了通道(give access to)在调用view方法之前获晓view方法及其参数,如果出现了,则它在__call__调用后,在self.get_response(request)之前调用,因此可以触发view 方法。(2)process_exception:如果在view方法中出现异常,该函数可以提供机会来处理异常(3)process_template_response:在self.get_response(request)调用后,view方法结束后,提供修改response的机会,需要注意的是该函数仅仅在view方法返回的是TemplateResponse类的情况下有效,如果返回的是render() ,则该函数不被触发。

详见 https://docs.djangoproject.com/en/3.1/topics/http/middleware/

(3)供进一步理解call stack 机制的小demo(仅供参考)

import time
class Base:
 def __init__(self,get_response):
  self.get_response=get_response
 def __call__(self,request=None):
  self.pre()
  response=self.get_response(request)
  self.after()
  return response
 def pre(self):
  pass
 def after(self):
  pass
class Response:
 def __init__(self):
  pass
def view(request):
 return Response()
def startServer(callstackSets,view):
 callstackSets.reverse()
 last=callstackSets.pop(0)(view)
 for i in range(len(callstackSets)):
  last=callstackSets.pop(0)(last)
 return last
class A(Base):
 def pre(self):
  print('In A')
 def after(self):
  print('Out A ')
class B(Base):
 def pre(self):
  print('In B')
 def after(self):
  print('Out B ')
class C(Base):
 def pre(self):
  print('In C')
 def after(self):
  print('Out C ')
if __name__=='__main__':
 callstackSets=[A,B,C]
 calls=startServer(callstackSets,view)
 calls('req')

运行后:

理解Django 中Call Stack机制的小Demo

可以看到完成了既定的目标,request进来后,一层一层的进入,直到最内层C,调用view方法,得到response,然后将response从最内层一层一层的传递出来!

到此这篇关于理解Django 中Call Stack机制的小Demo的文章就介绍到这了,更多相关Django Call Stack机制内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
浅析Python中的join()方法的使用
May 19 Python
Python新手入门最容易犯的错误总结
Apr 24 Python
Python画图高斯分布的示例
Jul 10 Python
python生成器用法实例详解
Nov 22 Python
python中如何使用insert函数
Jan 09 Python
Python键鼠操作自动化库PyAutoGUI简介(小结)
May 17 Python
Keras 切换后端方式(Theano和TensorFlow)
Jun 19 Python
sklearn的predict_proba使用说明
Jun 28 Python
python用分数表示矩阵的方法实例
Jan 11 Python
如何用 Python 制作 GitHub 消息助手
Feb 20 Python
Python还能这么玩之用Python修改了班花的开机密码
Jun 04 Python
python3中apply函数和lambda函数的使用详解
Feb 28 Python
如何快速理解python的垃圾回收机制
Sep 01 #Python
Python Opencv图像处理基本操作代码详解
Aug 31 #Python
Python Matplotlib绘图基础知识代码解析
Aug 31 #Python
一些关于python 装饰器的个人理解
Aug 31 #Python
Python常用模块函数代码汇总解析
Aug 31 #Python
PyTorch 导数应用的使用教程
Aug 31 #Python
PyTorch安装与基本使用详解
Aug 31 #Python
You might like
PHP 防注入函数(格式化数据)
2011/08/08 PHP
php获取当前时间的毫秒数的方法
2014/01/26 PHP
php 输入输出流详解及示例代码
2016/08/25 PHP
浅谈PHP中的Trait使用方法
2019/03/22 PHP
PHP常用的类封装小结【4个工具类】
2019/06/28 PHP
用javascript获取地址栏参数
2006/12/22 Javascript
jq选项卡鼠标延迟的插件实例
2013/05/13 Javascript
js和jquery如何获取图片真实的宽度和高度
2014/09/28 Javascript
javascript模拟实现ajax加载框实例
2014/10/15 Javascript
浅谈JavaScript Date日期和时间对象
2014/12/29 Javascript
判断输入的字符串是否是日期格式的简单方法
2016/07/11 Javascript
javascript特效实现——当前时间和倒计时效果的简单实例
2016/07/20 Javascript
jQuery图片切换动画特效
2016/11/02 Javascript
JavaScript数据结构之二叉树的计数算法示例
2017/04/13 Javascript
关于Promise 异步编程的实例讲解
2017/09/01 Javascript
ES6 javascript的异步操作实例详解
2017/10/30 Javascript
[43:48]Ti4正赛第一天 VG vs NEWBEE 2
2014/07/19 DOTA
跟老齐学Python之for循环语句
2014/10/02 Python
Python AES加密模块用法分析
2017/05/22 Python
pycharm 2019 最新激活方式(pycharm破解、激活)
2020/09/22 Python
Python timeit模块的使用实践
2020/01/13 Python
Python计算机视觉里的IOU计算实例
2020/01/17 Python
PyTorch笔记之scatter()函数的使用
2020/02/12 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
2020/02/26 Python
如何解决安装python3.6.1失败
2020/07/01 Python
HTML5 Canvas 绘图——使用 Canvas 绘制图形图文教程 使用html5 canvas 绘制精美的图
2015/08/31 HTML / CSS
法国面料和小百货在线商店:Mondial Tissus
2019/03/23 全球购物
马来西亚最大的在线隐形眼镜商店:MrLens
2019/03/27 全球购物
护士的岗位职责
2013/12/04 职场文书
兼职业务员岗位职责
2014/01/01 职场文书
文明风采获奖感言
2014/02/18 职场文书
高中军训感言800字
2014/03/05 职场文书
餐饮总经理岗位职责
2014/03/07 职场文书
北京离婚协议书范文2014
2014/09/29 职场文书
大学生考试作弊检讨书1000字
2014/10/14 职场文书
2014幼儿园大班工作总结
2014/11/10 职场文书