理解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 相关文章推荐
pycharm 使用心得(一)安装和首次使用
Jun 05 Python
Python简单日志处理类分享
Feb 14 Python
Python 类的继承实例详解
Mar 25 Python
Python3学习笔记之列表方法示例详解
Oct 06 Python
python学习笔记--将python源文件打包成exe文件(pyinstaller)
May 26 Python
从django的中间件直接返回请求的方法
May 30 Python
Python get获取页面cookie代码实例
Sep 12 Python
python获取中文字符串长度的方法
Nov 14 Python
python实现维吉尼亚算法
Mar 20 Python
Python获取二维数组的行列数的2种方法
Feb 11 Python
python本地文件服务器实例教程
May 02 Python
python中redis包操作数据库的教程
Apr 19 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的安全
2006/10/09 PHP
php版微信小店调用api示例代码
2016/11/12 PHP
PHP实现微信小程序用户授权的工具类示例
2019/03/05 PHP
setTimeout和setInterval的区别你真的了解吗?
2011/03/31 Javascript
javascript高级学习笔记整理
2011/08/14 Javascript
开发插件的两个方法jquery.fn.extend与jquery.extend
2013/11/21 Javascript
js图片切换具体实现代码
2016/10/13 Javascript
js实现百度地图定位于地址逆解析,显示自己当前的地理位置
2016/12/08 Javascript
JavaScript数组复制详解
2017/02/02 Javascript
Mac中安装nvm的教程分享
2017/12/11 Javascript
Material(包括Material Icon)在Angular2中的使用详解
2018/02/11 Javascript
node中间层实现文件上传功能
2018/06/11 Javascript
js中数组对象去重的两种方法
2019/01/18 Javascript
vue项目中在外部js文件中直接调用vue实例的方法比如说this
2019/04/28 Javascript
electron+vue实现div contenteditable截图功能
2020/01/07 Javascript
通过js实现压缩图片上传功能
2020/02/25 Javascript
react的hooks的用法详解
2020/10/12 Javascript
Python随机生成数模块random使用实例
2015/04/13 Python
python选择排序算法实例总结
2015/07/01 Python
Python编码爬坑指南(必看)
2016/06/10 Python
python爬虫_自动获取seebug的poc实例
2017/08/05 Python
记一次python 内存泄漏问题及解决过程
2018/11/29 Python
python的继承知识点总结
2018/12/10 Python
numpy和pandas中数组的合并、拉直和重塑实例
2019/06/28 Python
python3.x 生成3维随机数组实例
2019/11/28 Python
Python自动化测试笔试面试题精选
2020/03/12 Python
如何在keras中添加自己的优化器(如adam等)
2020/06/19 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
2020/09/18 Python
会计主管岗位职责范文
2013/11/08 职场文书
汽车专业人才自我鉴定范文
2013/12/29 职场文书
餐厅采购员岗位职责
2014/03/06 职场文书
学生会宣传部部长竞选演讲稿
2014/04/25 职场文书
劳动仲裁代理词范文
2015/05/25 职场文书
两行代码解决Jupyter Notebook中文不能显示的问题
2021/04/24 Python
sql查询语句之平均分、最高最低分及排序语句
2022/05/30 MySQL