理解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机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • OpenCV基础HSV颜色空间*args与**kwargs滑动条传参问题

    OpenCV基础HSV颜色空间*args与**kwargs滑动条传参问题

    这篇文章主要介绍了OpenCV基础中HSV颜色空间*args与**kwargs滑动条传参问题的详细解析,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-10-10
  • Python实现微信高效自动化操作

    Python实现微信高效自动化操作

    在如今数字化时代,人们对于效率的追求越来越强烈,而PyAutoGUI和Pyperclip作为Python中的两个强大库,为我们实现自动化操作提供了便利,下面我们就来看看如何利用这两个库实现微信自动化操作吧
    2023-10-10
  • 详解python如何在django中为用户模型添加自定义权限

    详解python如何在django中为用户模型添加自定义权限

    这篇文章主要介绍了python如何在django中为用户模型添加自定义权限,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • 使用Python操作文件系统的方法

    使用Python操作文件系统的方法

    Python提供了许多内置库来处理文件系统,如os、shutil和pathlib等,这些库可以帮助你创建、删除、读取、写入文件和目录,这篇文章主要介绍了使用Python操作文件系统,需要的朋友可以参考下
    2023-07-07
  • 获取python文件扩展名和文件名方法

    获取python文件扩展名和文件名方法

    本篇文章通过python写一个获取python文件扩展名和文件名的功能,并分享了代码,有兴趣的参考下。
    2018-02-02
  • 详解如何理解并正确使用Python中的f字符串

    详解如何理解并正确使用Python中的f字符串

    Python中的f字符串是一种字符串格式化语法,它可以将变量、表达式和函数等动态地嵌入到字符串中,本文就来详细讲讲如何理解并正确使用它吧
    2023-06-06
  • 一小时学会TensorFlow2之自定义层

    一小时学会TensorFlow2之自定义层

    这篇文章主要介绍了TensorFlow2之自定义层,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Python简单实现Base64编码和解码的方法

    Python简单实现Base64编码和解码的方法

    这篇文章主要介绍了Python简单实现Base64编码和解码的方法,结合具体实例形式分析了Python实现base64编码解码相关函数与使用技巧,需要的朋友可以参考下
    2017-04-04
  • python爬虫遇到403错误的问题及解决

    python爬虫遇到403错误的问题及解决

    这篇文章主要介绍了python爬虫遇到403错误的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • Python中字符串的修改及传参详解

    Python中字符串的修改及传参详解

    最近在一次使用python实现字符串反转的时候,发现写出的代码居然是错误的,于是通过思考后决定要总结下这次的经历,于是写了这篇文章,本文的内容主要给大家介绍了Python中字符串的修改及传参,有需要的朋友们可以参考借鉴,下面来一起学习学习吧。
    2016-11-11

最新评论