理解Django 中Call Stack机制的小Demo
1.工作流程
request/response模式下,request并不是直接到达view方法,view方法也不是将返回的response直接发送给浏览器的,而是request由外到里的层层通过各种middleware层,这个时候可以对request做一些事情,到最后一层也就是最内层时,得到view方法返回的response,然后再把这个response再由内到外层层传递出来,这时候可以对response做一些事情,如下图:
2.原理
classSimpleMiddleware: def__init__(self,get_response): self.get_response=get_response #One-timeconfigurationandinitialization. def__call__(self,request): #Codetobeexecutedforeachrequestbefore #theview(andlatermiddleware)arecalled. response=self.get_response(request) #Codetobeexecutedforeachrequest/responseafter #theviewiscalled. returnresponse
每个middleware都如上面代码一样,有两个必须的函数:(1)__init__(self,get_response),负责在webserver启动时完成初始化,即建立与下一层middleware的联系.(2)__call__(self,request),在每次request下,被调用。
有三个可选的函数:(1)process_view:__init__和__call__对view方法一无所知,而process_view给了通道(giveaccessto)在调用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)供进一步理解callstack机制的小demo(仅供参考)
importtime classBase: def__init__(self,get_response): self.get_response=get_response def__call__(self,request=None): self.pre() response=self.get_response(request) self.after() returnresponse defpre(self): pass defafter(self): pass classResponse: def__init__(self): pass defview(request): returnResponse() defstartServer(callstackSets,view): callstackSets.reverse() last=callstackSets.pop(0)(view) foriinrange(len(callstackSets)): last=callstackSets.pop(0)(last) returnlast classA(Base): defpre(self): print('InA') defafter(self): print('OutA') classB(Base): defpre(self): print('InB') defafter(self): print('OutB') classC(Base): defpre(self): print('InC') defafter(self): print('OutC') if__name__=='__main__': callstackSets=[A,B,C] calls=startServer(callstackSets,view) calls('req')
运行后:
可以看到完成了既定的目标,request进来后,一层一层的进入,直到最内层C,调用view方法,得到response,然后将response从最内层一层一层的传递出来!
到此这篇关于理解Django中CallStack机制的小Demo的文章就介绍到这了,更多相关DjangoCallStack机制内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。