理解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中使用base64模块处理字符编码的教程
Apr 28 Python
python实现在sqlite动态创建表的方法
May 08 Python
Python入门_浅谈for循环、while循环
May 16 Python
python实现网页自动签到功能
Jan 21 Python
python实现几种归一化方法(Normalization Method)
Jul 31 Python
python对象转字典的两种实现方式示例
Nov 07 Python
python-docx文件定位读取过程(尝试替换)
Feb 13 Python
PyQt5结合matplotlib绘图的实现示例
Sep 15 Python
Python 中Operator模块的使用
Jan 30 Python
python requests模块的使用示例
Apr 07 Python
Python开发之QT解决无边框界面拖动卡屏问题(附带源码)
May 27 Python
详解Python中__new__方法的作用
Mar 31 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字符串的替换,分割和连接方法
2016/05/23 PHP
PHP echo()函数讲解
2019/02/15 PHP
jQuery中使用Ajax获取JSON格式数据示例代码
2013/11/26 Javascript
JavaScript判断变量是对象还是数组的方法
2014/08/28 Javascript
js实现简单锁屏功能实例
2015/05/27 Javascript
详解AngularJS实现表单验证
2015/12/10 Javascript
快速掌握WordPress中加载JavaScript脚本的方法
2015/12/17 Javascript
JS实现iframe自适应高度的方法(兼容IE与FireFox)
2016/06/24 Javascript
HTML5 JS压缩图片并获取图片BASE64编码上传
2020/11/16 Javascript
Ajax高级笔记 JavaScript高级程序设计笔记
2017/06/22 Javascript
详解如何理解vue的key属性
2019/04/14 Javascript
简单了解微信小程序的目录结构
2019/07/01 Javascript
JS把字符串格式的时间转换成几秒前、几分钟前、几小时前、几天前等格式
2019/07/10 Javascript
layUI使用layer.open,在content打开数据表格,获取值并返回的方法
2019/09/26 Javascript
微信小程序自定义tabbar custom-tab-bar 6s出不来解决方案(cover-view不兼容)
2019/11/01 Javascript
vue 使用 vue-pdf 实现pdf在线预览的示例代码
2020/04/26 Javascript
[42:27]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第三局
2016/03/05 DOTA
python jieba分词并统计词频后输出结果到Excel和txt文档方法
2018/02/11 Python
python 使用值来排序一个字典的方法
2018/11/16 Python
Python实现爬取马云的微博功能示例
2019/02/16 Python
python爬取微信公众号文章的方法
2019/02/26 Python
使用python切片实现二维数组复制示例
2019/11/26 Python
Pandas时间序列:重采样及频率转换方式
2019/12/26 Python
flask框架自定义url转换器操作详解
2020/01/25 Python
基于python爬取有道翻译过程图解
2020/03/31 Python
python包的导入方式总结
2021/03/02 Python
潘多拉珠宝美国官方网站:Pandora US
2020/06/18 全球购物
Servlet的实例是在生命周期什么时候创建的?配置servlet最重要的是什么?
2012/05/30 面试题
司机的工作范围及职责
2013/11/13 职场文书
自我评价优秀范文分享
2013/11/30 职场文书
高中生毕业评语
2014/12/30 职场文书
电影开国大典观后感
2015/06/04 职场文书
中学总务处工作总结
2015/08/12 职场文书
javaScript Array api梳理
2021/03/31 Javascript
pytorch显存一直变大的解决方案
2021/04/08 Python
Python爬虫之爬取二手房信息
2021/04/27 Python