理解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中Django 后台自定义表单控件
Mar 28 Python
Python 和 JS 有哪些相同之处
Nov 23 Python
python读取Excel实例详解
Aug 17 Python
python3.6.3安装图文教程 TensorFlow安装配置方法
Jun 24 Python
Python小白必备的8个最常用的内置函数(推荐)
Apr 03 Python
Django REST framework 分页的实现代码
Jun 19 Python
python针对mysql数据库的连接、查询、更新、删除操作示例
Sep 11 Python
如何在python中写hive脚本
Nov 08 Python
Python面向对象之多态原理与用法案例分析
Dec 30 Python
python3 正则表达式基础廖雪峰
Mar 25 Python
Python判断远程服务器上Excel文件是否被人打开的方法
Jul 13 Python
Python内置函数property()如何使用
Sep 01 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
古巴咖啡 Cubita琥爵咖啡 独特的加勒比海风味咖啡
2021/03/06 新手入门
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
2007/02/11 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装最快的解决办法
2010/08/01 PHP
PHP求小于1000的所有水仙花数的代码
2012/01/10 PHP
php读取csv文件并输出的方法
2015/03/14 PHP
Yii框架实现的验证码、登录及退出功能示例
2017/05/20 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
JQuery UI的拖拽功能实现方法小结
2012/03/14 Javascript
页面刷新时记住滚动条的位置jquery代码
2014/06/17 Javascript
javascript父、子页面交互技巧总结
2014/08/08 Javascript
angularJS 中$scope方法使用指南
2015/02/09 Javascript
jQuery学习心得总结(必看篇)
2016/06/10 Javascript
AngularJS基础 ng-include 指令简单示例
2016/08/01 Javascript
jQuery 判断是否包含在数组中Array[]的方法
2016/08/03 Javascript
纯js和css完成贪吃蛇小游戏demo
2016/09/01 Javascript
jQuery鼠标悬停内容动画切换效果
2017/04/27 jQuery
详解webpack和webpack-simple中如何引入css文件
2017/06/28 Javascript
ReactJs实现树形结构的数据显示的组件的示例
2017/08/18 Javascript
nodejs操作mongodb的增删改查功能实例
2017/11/09 NodeJs
在vue中使用css modules替代scroped的方法
2018/03/10 Javascript
vue中格式化时间过滤器代码实例
2019/04/17 Javascript
vue使用微信扫一扫功能的实现代码
2020/04/11 Javascript
[35:34]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python 从远程服务器下载日志文件的程序
2013/02/10 Python
Python开发实例分享bt种子爬虫程序和种子解析
2014/05/21 Python
python版本的读写锁操作方法
2016/04/25 Python
Python读取xlsx文件的实现方法
2019/07/04 Python
Python @property装饰器原理解析
2020/01/22 Python
简单了解django文件下载方式
2020/02/10 Python
如何用SQL语句进行模糊查找
2015/09/25 面试题
同学聚会老师邀请函
2014/01/28 职场文书
篝火晚会主持词
2014/03/25 职场文书
老公保证书范文
2014/04/29 职场文书
教师自我剖析材料(群众路线)
2014/09/29 职场文书
Python基础之函数嵌套知识总结
2021/05/23 Python
Python实战之OpenCV实现猫脸检测
2021/06/26 Python