理解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采集腾讯新闻实例
Jul 10 Python
python实现实时监控文件的方法
Aug 26 Python
初学python的操作难点总结(新手必看篇)
Aug 03 Python
使用50行Python代码从零开始实现一个AI平衡小游戏
Nov 21 Python
pandas DataFrame索引行列的实现
Jun 04 Python
Python格式化字符串f-string概览(小结)
Jun 18 Python
Python自动化完成tb喵币任务的操作方法
Oct 30 Python
python支持多线程的爬虫实例
Dec 21 Python
详解Pycharm安装及Django安装配置指南
Sep 15 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
Nov 13 Python
Python的这些库,你知道多少?
Jun 09 Python
总结python多进程multiprocessing的相关知识
Jun 29 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
利用js调用后台php进行数据处理原码
2006/10/09 PHP
PHP Error与Logging函数的深入理解
2013/06/03 PHP
PHP中session变量的销毁
2014/02/27 PHP
Yii框架中memcache用法实例
2014/12/03 PHP
Yii2中OAuth扩展及QQ互联登录实现方法
2016/05/16 PHP
PHP实现SMTP邮件的发送实例
2018/09/27 PHP
JavaScript 闭包在封装函数时的简单分析
2009/11/28 Javascript
jquery select操作的日期联动实现代码
2009/12/06 Javascript
JS 自定义函数缺省值的设置方法
2010/05/05 Javascript
Jquery实现弹出层分享微博插件具备动画效果
2013/04/03 Javascript
javascript中的循环语句for语句深入理解
2014/04/04 Javascript
有关Promises异步问题详解
2015/11/13 Javascript
Highcharts入门之简介
2016/08/02 Javascript
微信小程序 Page()函数详解
2016/10/17 Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
2016/11/03 Javascript
div实现自适应高度的textarea实现angular双向绑定
2017/01/08 Javascript
canvas仿iwatch时钟效果
2017/03/06 Javascript
angular.fromJson与toJson方法用法示例
2017/05/17 Javascript
vue过渡和animate.css结合使用详解
2017/06/14 Javascript
JavaScript实现构造json数组的方法分析
2018/08/17 Javascript
稍微学一下Vue的数据响应式(Vue2及Vue3区别)
2019/11/21 Javascript
Vue 监听元素前后变化值实例
2020/07/29 Javascript
js实现批量删除功能
2020/08/27 Javascript
[27:28]Ti4 冒泡赛第二天 iG vs NEWBEE 1
2014/07/15 DOTA
简化Python的Django框架代码的一些示例
2015/04/20 Python
Queue 实现生产者消费者模型(实例讲解)
2017/11/13 Python
Python二叉树的定义及常用遍历算法分析
2017/11/24 Python
flask入门之文件上传与邮件发送示例
2018/07/18 Python
python使用if语句实现一个猜拳游戏详解
2019/08/27 Python
Python如何在windows环境安装pip及rarfile
2020/06/15 Python
html5视频自动横过来自适应页面且点击播放功能的实现
2020/06/03 HTML / CSS
售后服务承诺书模板
2014/05/21 职场文书
2014年统计工作总结
2014/11/21 职场文书
单位接收证明格式
2015/06/18 职场文书
Go语言的协程上下文的几个方法和用法
2022/04/11 Golang
Java 多态分析
2022/04/26 Java/Android