理解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绘制数据的瀑布图的教程
Apr 07 Python
python输入错误密码用户锁定实现方法
Nov 27 Python
python实现时间o(1)的最小栈的实例代码
Jul 23 Python
python pandas实现excel转为html格式的方法
Oct 23 Python
python三方库之requests的快速上手
Mar 04 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
Jun 04 Python
使用Filter过滤python中的日志输出的实现方法
Jul 17 Python
Python学习笔记之迭代器和生成器用法实例详解
Aug 08 Python
pytorch 预训练层的使用方法
Aug 20 Python
Numpy的简单用法小结
Aug 28 Python
python相对企业语言优势在哪
Jun 12 Python
只需要这一行代码就能让python计算速度提高十倍
May 24 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 strtotime函数详解
2009/12/18 PHP
高性能PHP框架Symfony2经典入门教程
2014/07/08 PHP
Centos下升级php5.2到php5.4全记录(编译安装)
2015/04/03 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
2017/08/01 PHP
Laravel定时任务的每秒执行代码
2019/10/22 PHP
免费空间广告万能消除代码
2006/09/04 Javascript
Document:getElementsByName()使用方法及示例
2013/10/28 Javascript
js中小数转换整数的方法
2014/01/26 Javascript
JavaScript中对象介绍
2014/12/31 Javascript
如何减少浏览器的reflow和repaint
2015/02/26 Javascript
jquery实现简单的二级导航下拉菜单效果
2015/09/07 Javascript
Node.js的npm包管理器基础使用教程
2016/05/26 Javascript
js严格模式总结(分享)
2016/08/22 Javascript
BootStrap3使用错误记录及解决办法
2016/12/22 Javascript
详解windows下vue-cli及webpack 构建网站(三)使用组件
2017/06/17 Javascript
浅谈从React渲染流程分析Diff算法
2018/09/08 Javascript
Javascript 实现 Excel 导入生成图表功能
2018/10/22 Javascript
ES6入门教程之变量的解构赋值详解
2019/04/13 Javascript
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
Python中的lstrip()方法使用简介
2015/05/19 Python
Python字符串格式化输出方法分析
2016/04/13 Python
python字符串,数值计算
2016/10/05 Python
python使用pymongo操作mongo的完整步骤
2019/04/13 Python
python模块和包的应用BASE_PATH使用解析
2019/12/14 Python
详解用Python爬虫获取百度企业信用中企业基本信息
2020/07/02 Python
用纯css3实现的图片放大镜特效效果非常不错
2014/09/02 HTML / CSS
HTML5 Canvas API中drawImage()方法的使用实例
2016/03/25 HTML / CSS
日本PLST在线商店:日本时尚杂志刊载的人气服装
2016/12/10 全球购物
康拓普公司Java笔面试
2016/09/23 面试题
ShellScript面试题一则-ShellScript编程
2014/03/05 面试题
母亲节演讲稿范文
2014/01/02 职场文书
2014年自我评价
2014/01/04 职场文书
2014年老干部工作总结
2014/11/21 职场文书
《卧薪尝胆》读后感3篇
2019/12/26 职场文书
Go语言grpc和protobuf
2022/04/13 Golang
Window server 2012 R2 AD域的组策略相关设置
2022/04/28 Servers