理解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的Django框架中创建和使用模版
Jul 15 Python
python编程培训 python培训靠谱吗
Jan 17 Python
Django中的文件的上传的几种方式
Jul 23 Python
对python 多个分隔符split 的实例详解
Dec 20 Python
Python  Django 母版和继承解析
Aug 09 Python
python保留小数位的三种实现方法
Jan 07 Python
浅谈tensorflow模型保存为pb的各种姿势
May 25 Python
详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
Aug 04 Python
python连接mysql数据库并读取数据的实现
Sep 25 Python
python如何提升爬虫效率
Sep 27 Python
python实现图片批量压缩
Apr 24 Python
Python 避免字典和元组的多重嵌套问题
Jul 15 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实现的支持imagemagick及gd库两种处理的缩略图生成类
2014/09/23 PHP
php中JSON的使用方法
2015/04/30 PHP
centos 7.2下搭建LNMP环境教程
2016/11/20 PHP
php_pdo 预处理语句详解
2016/11/21 PHP
很可爱的输入框
2008/08/03 Javascript
巧用jquery解决下拉菜单被Div遮挡的相关问题
2014/02/13 Javascript
抛弃Nginx使用nodejs做反向代理服务器
2014/07/17 NodeJs
js用Date对象的setDate()函数对日期进行加减操作
2014/09/18 Javascript
js判断输入字符串是否为空、空格、null的方法总结
2016/06/14 Javascript
js实现常用排序算法
2016/08/09 Javascript
webpack多页面开发实践
2017/12/18 Javascript
vue axios整合使用全攻略
2018/05/24 Javascript
抖音上用记事本编写爱心小程序教程
2019/04/17 Javascript
Vue2.x通用条件搜索组件的封装及应用详解
2019/05/28 Javascript
vue中的面包屑导航组件实例代码
2019/07/01 Javascript
浅谈laytpl 模板空值显示null的解决方法及简单的js表达式
2019/09/19 Javascript
微信小程序实现选择地址省市区三级联动
2020/06/21 Javascript
JavaScript 空间坐标的使用
2020/08/19 Javascript
Javascript var变量删除原理及实现
2020/08/26 Javascript
python访问mysql数据库的实现方法(2则示例)
2016/01/06 Python
python编写微信远程控制电脑的程序
2018/01/05 Python
Python+OpenCV图片局部区域像素值处理改进版详解
2019/01/23 Python
Python的UTC时间转换讲解
2019/02/26 Python
Python生成一个迭代器的实操方法
2019/06/18 Python
Django框架下静态模板的继承操作示例
2019/11/08 Python
基于Python批量生成指定尺寸缩略图代码实例
2019/11/20 Python
python tkinter 设置窗口大小不可缩放实例
2020/03/04 Python
django 链接多个数据库 并使用原生sql实现
2020/03/28 Python
基于Keras中Conv1D和Conv2D的区别说明
2020/06/19 Python
澳大利亚便宜的家庭购物网站:CrazySales
2018/02/06 全球购物
军训自我鉴定
2014/01/22 职场文书
公司股权转让协议书
2014/04/12 职场文书
社区党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
南京大屠杀观后感
2015/06/02 职场文书
2016年猴年新春致辞
2015/08/01 职场文书
python 实现两个变量值进行交换的n种操作
2021/06/02 Python