理解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 13 Python
Python实现Smtplib发送带有各种附件的邮件实例
Jun 05 Python
python 接口_从协议到抽象基类详解
Aug 24 Python
python 读写中文json的实例详解
Oct 29 Python
使用TensorFlow实现SVM
Sep 06 Python
详解Python函数式编程—高阶函数
Mar 29 Python
Django 自动生成api接口文档教程
Nov 19 Python
python转化excel数字日期为标准日期操作
Jul 14 Python
通过代码简单了解django model序列化作用
Nov 12 Python
Pytorch实现WGAN用于动漫头像生成
Mar 04 Python
Python批量将csv文件转化成xml文件的实例
May 10 Python
python+opencv实现目标跟踪过程
Jun 21 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
完美解决:Apache启动问题―(OS 10022)提供了一个无效的参数
2013/06/08 PHP
用Zend Studio+PHPnow+Zend Debugger搭建PHP服务器调试环境步骤
2014/01/19 PHP
php中try catch捕获异常实例详解
2014/11/21 PHP
PHP 使用二进制保存用户状态的实例
2018/01/29 PHP
jQuery ajax中使用confirm,确认是否删除的简单实例
2016/06/17 Javascript
js基于cookie记录来宾姓名的方法
2016/07/19 Javascript
js实现hashtable的赋值、取值、遍历操作实例详解
2016/12/25 Javascript
uploader秒传图片到服务器完整代码
2017/04/22 Javascript
jQuery实现可拖动进度条实例代码
2017/06/21 jQuery
javascript 跨域问题以及解决办法
2017/07/17 Javascript
jQuery实现的下雪动画效果示例【附源码下载】
2018/02/02 jQuery
解决Angular.js中使用Swiper插件不能滑动的问题
2018/02/26 Javascript
JSON基本语法及与JavaScript的异同实例分析
2019/01/04 Javascript
JQuery常用简单动画操作方法回顾与总结
2019/12/07 jQuery
vue使用微信扫一扫功能的实现代码
2020/04/11 Javascript
[06:44]2014DOTA2国际邀请赛-钥匙体育馆开战 开幕式振奋人心
2014/07/19 DOTA
[36:14]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第二局
2016/02/28 DOTA
Python通过select实现异步IO的方法
2015/06/04 Python
win7上python2.7连接mysql数据库的方法
2017/01/14 Python
用 Python 爬了爬自己的微信朋友(实例讲解)
2017/08/25 Python
numpy中矩阵合并的实例
2018/06/15 Python
Pycharm设置去除显示的波浪线方法
2018/10/28 Python
使用Pyinstaller转换.py文件为.exe可执行程序过程详解
2019/08/06 Python
python保存log日志,实现用log日志画图
2019/12/24 Python
Python实现删除某列中含有空值的行的示例代码
2020/07/20 Python
const char*, char const*, char*const的区别是什么
2014/07/09 面试题
JSP和EJB可以共享HttpSession么?EJB里面可以改变session里面的内容
2013/06/05 面试题
初中三好学生事迹材料
2014/01/13 职场文书
幼儿园元旦亲子活动方案
2014/02/17 职场文书
学习“七一”讲话精神体会
2014/07/08 职场文书
大学生暑期社会实践证明范本
2014/10/24 职场文书
团代会开幕词
2015/01/28 职场文书
土地租赁协议书
2015/01/29 职场文书
2015年毕业生自荐信范文
2015/03/24 职场文书
通用员工手册范本
2015/05/14 职场文书
Vue Element plus使用方法梳理
2022/12/24 Vue.js