理解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模拟登陆Tom邮箱示例分享
Jan 13 Python
Python中int()函数的用法浅析
Oct 17 Python
python图像处理入门(一)
Apr 04 Python
Python基础学习之类与实例基本用法与注意事项详解
Jun 17 Python
详解Python3迁移接口变化采坑记
Oct 11 Python
pandas 中对特征进行硬编码和onehot编码的实现
Dec 20 Python
django列表筛选功能的实现代码
Mar 27 Python
基于python计算并显示日间、星期客流高峰
May 07 Python
用python爬虫批量下载pdf的实现
Dec 01 Python
详解Python中的文件操作
Jan 14 Python
Python3 + Appium + 安卓模拟器实现APP自动化测试并生成测试报告
Jan 27 Python
Python使用openpyxl批量处理数据
Jun 23 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
比file_get_contents稳定的curl_get_contents分享
2012/01/11 PHP
php setcookie函数的参数说明及其用法
2014/04/20 PHP
ThinkPHP查询中的魔术方法简述
2014/06/25 PHP
thinkPHP数据库增删改查操作方法实例详解
2016/12/06 PHP
Jquery实现图片左右自动滚动示例
2013/09/25 Javascript
Nginx上传文件全部缓存解决方案
2015/08/17 Javascript
详谈$.data()的用法和作用
2017/02/13 Javascript
JS中mouseup事件丢失的原因与解决办法
2017/06/14 Javascript
jQuery常用选择器详解
2017/07/17 jQuery
VUE实现强制渲染,强制更新
2019/10/29 Javascript
Vue中登录验证成功后保存token,并每次请求携带并验证token操作
2020/09/08 Javascript
[04:40]2016国际邀请赛中国区预选赛全程TOP10镜头集锦
2016/07/01 DOTA
[01:11:32]VG vs FNATIC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
分析在Python中何种情况下需要使用断言
2015/04/01 Python
Python使用matplotlib实现在坐标系中画一个矩形的方法
2015/05/20 Python
python实现将文本转换成语音的方法
2015/05/28 Python
Python中在for循环中嵌套使用if和else语句的技巧
2016/06/20 Python
python对配置文件.ini进行增删改查操作的方法示例
2017/07/28 Python
Python输出由1,2,3,4组成的互不相同且无重复的三位数
2018/02/01 Python
python之pyqt5通过按钮改变Label的背景颜色方法
2019/06/13 Python
python3.x 生成3维随机数组实例
2019/11/28 Python
对pytorch的函数中的group参数的作用介绍
2020/02/18 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
2020/04/24 Python
PyQt5实现登录页面
2020/05/30 Python
python爬虫实例之获取动漫截图
2020/05/31 Python
解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)
2020/08/07 Python
通过代码实例解析Pytest运行流程
2020/08/20 Python
HTML5 CSS3实现一个精美VCD包装盒个性幻灯片案例
2014/06/16 HTML / CSS
英国Zoro工具:手动工具,电动工具和个人防护用品
2016/11/02 全球购物
英国网络托管和域名领导者:Web Hosting UK
2017/10/15 全球购物
英国婴儿及儿童产品商店:TigerParrot
2019/03/04 全球购物
Michael Kors加拿大官网:购买设计师手袋、手表、鞋子、服装等
2019/03/16 全球购物
高中生自我评语大全
2014/01/19 职场文书
正风肃纪查摆剖析材料
2014/10/10 职场文书
会计稽核岗位职责
2015/04/13 职场文书
2016关于军训的心得体会
2016/01/11 职场文书