理解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实现周期性抓取网页内容的方法
Nov 04 Python
用python写的一个wordpress的采集程序
Feb 27 Python
Python之自动获取公网IP的实例讲解
Oct 01 Python
python Flask实现restful api service
Dec 04 Python
Python实现基于KNN算法的笔迹识别功能详解
Jul 09 Python
在PyCharm中实现关闭一个死循环程序的方法
Nov 29 Python
python 随机打乱 图片和对应的标签方法
Dec 14 Python
Python获取命令实时输出-原样彩色输出并返回输出结果的示例
Jul 11 Python
numpy实现神经网络反向传播算法的步骤
Dec 24 Python
Python3中configparser模块读写ini文件并解析配置的用法详解
Feb 18 Python
Python Django2 model 查询介绍(条件、范围、模糊查询)
Mar 16 Python
详解Python高阶函数
Aug 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
overlord人气高涨,却被菲利普频繁举报,第四季很难在国内上映
2020/05/06 日漫
拼音码表的生成
2006/10/09 PHP
图书管理程序(二)
2006/10/09 PHP
php for 循环语句使用方法详细说明
2010/05/09 PHP
PHP extract 将数组拆分成多个变量的函数
2010/06/30 PHP
php生成短域名函数
2015/03/23 PHP
PHP的Laravel框架中使用消息队列queue及异步队列的方法
2016/03/21 PHP
PHP 数组基本操作方法详解
2016/06/17 PHP
浅谈PHP的数据库接口和技术
2016/12/09 PHP
php 中的closure用法详解
2017/06/12 PHP
Prototype 学习 工具函数学习($A方法)
2009/07/12 Javascript
使用SyntaxHighlighter实现HTML高亮显示代码的方法
2010/02/04 Javascript
jquery实现对联广告的方法
2015/02/05 Javascript
详解JavaScript中数组的reduce方法
2016/12/02 Javascript
jQuery插件FusionCharts实现的Marimekko图效果示例【附demo源码】
2017/03/24 jQuery
js模仿微信朋友圈计算时间显示几天/几小时/几分钟/几秒之前
2017/04/27 Javascript
Vuejs 单文件组件实例详解
2018/02/09 Javascript
Bootstrap Table中的多选框删除功能
2018/07/15 Javascript
在 Angular6 中使用 HTTP 请求服务端数据的步骤详解
2018/08/06 Javascript
微信小程序遍历Echarts图表实现多个饼图
2019/04/25 Javascript
Layui table field初始化加载时进行隐藏的方法
2019/09/19 Javascript
JavaScript仿京东秒杀倒计时
2020/03/17 Javascript
[03:12]完美世界DOTA2联赛PWL DAY7集锦
2020/11/06 DOTA
Python实现根据指定端口探测服务器/模块部署的方法
2014/08/25 Python
Python编码爬坑指南(必看)
2016/06/10 Python
Python实现生成随机日期字符串的方法示例
2017/12/25 Python
flask中主动抛出异常及统一异常处理代码示例
2018/01/18 Python
树莓派使用python-librtmp实现rtmp推流h264的方法
2019/07/22 Python
Python操作Jira库常用方法解析
2020/04/10 Python
局域网定义和特性
2016/01/23 面试题
建材投资建议书
2014/05/16 职场文书
2014国庆节演讲稿:祖国在我心中(400字)
2014/09/25 职场文书
前台接待岗位职责
2015/02/03 职场文书
教师教育教学随笔
2015/08/15 职场文书
观看《信仰》心得体会
2016/01/15 职场文书
Python Pandas知识点之缺失值处理详解
2021/05/11 Python