理解Django 中Call Stack机制的小Demo

 更新时间:2020年09月01日 08:30:09   作者:JohnYang  
这篇文章主要介绍了理解Django 中Call Stack 机制的小Demo,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1.工作流程

request/response模式下,request并不是直接到达view方法,view方法也不是将返回的response直接发送给浏览器的,而是request由外到里的层层通过各种middleware层,这个时候可以对request做一些事情,到最后一层也就是最内层时,得到view方法返回的response,然后再把这个response再由内到外层层传递出来,这时候可以对response做一些事情,如下图:

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')

运行后:

可以看到完成了既定的目标,request进来后,一层一层的进入,直到最内层C,调用view方法,得到response,然后将response从最内层一层一层的传递出来!

到此这篇关于理解Django 中Call Stack机制的小Demo的文章就介绍到这了,更多相关Django Call Stack机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python 调用DLL操作抄表机

    Python 调用DLL操作抄表机

    Python 调用DLL的实用代码。
    2009-01-01
  • python字符串不可变数据类型

    python字符串不可变数据类型

    这篇文章主要介绍了python字符串不可变数据类型,下文关于python字符串不可变数据类型相关资料展开的内容主要有查找子串及数量、字符串的替换、分割以及合并、删除侧边的空白等内容,需要的小伙伴可以参考一下
    2022-02-02
  • Python个人博客程序开发实例信息显示

    Python个人博客程序开发实例信息显示

    这篇文章主要介绍了怎样用Python来实现一个完整的个人博客系统,我们通过实操上手的方式可以高效的巩固所学的基础知识,感兴趣的朋友一起来看看吧
    2022-12-12
  • Python实现有趣的亲戚关系计算器

    Python实现有趣的亲戚关系计算器

    每年的春节,都会有一些自己几乎没印象但父母就是很熟的亲戚,关系凌乱到你自己都说不清。本文就来用Python制作一个有趣的亲戚关系计算器,感兴趣的可以了解一下
    2023-01-01
  • Python实现笑脸检测+人脸口罩检测功能

    Python实现笑脸检测+人脸口罩检测功能

    这篇文章主要介绍了Python实现笑脸检测+人脸口罩检测,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • python实现挑选出来100以内的质数

    python实现挑选出来100以内的质数

    这篇文章主要介绍了python实现挑选出来100以内的质数,由于是新手,思路有限,如有问题,还请大家指正,需要的朋友可以参考下
    2015-03-03
  • pandas中read_csv的缺失值处理方式

    pandas中read_csv的缺失值处理方式

    今天小编就为大家分享一篇pandas中read_csv的缺失值处理方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • Python中Class类用法实例分析

    Python中Class类用法实例分析

    这篇文章主要介绍了Python中Class类用法,以实例形式较为详细的分析了Python中类的定义及相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • 一文详解Python中多进程和进程池的使用方法

    一文详解Python中多进程和进程池的使用方法

    这篇文章将介绍Python中多进程和进程池的使用方法,并提供一些实用的案例供大家参考,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-04-04
  • 一文教你学会使用Python中的多处理模块

    一文教你学会使用Python中的多处理模块

    Python 多处理模块是一个强大的工具,用于实现并行处理,提高程序的性能和效率,本文将详细介绍 Python 中多处理模块的使用方法,希望对大家有所帮助
    2024-01-01

最新评论