最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

理解Django 中Call Stack機制的小Demo

 更新時間:2020年09月01日 08:30:09   作者:JohnYang  
這篇文章主要介紹了理解Django 中Call Stack 機制的小Demo,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1.工作流程

request/response模式下,request并不是直接到達(dá)view方法,view方法也不是將返回的response直接發(fā)送給瀏覽器的,而是request由外到里的層層通過各種middleware層,這個時候可以對request做一些事情,到最后一層也就是最內(nèi)層時,得到view方法返回的response,然后再把這個response再由內(nèi)到外層層傳遞出來,這時候可以對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都如上面代碼一樣,有兩個必須的函數(shù):(1)__init__(self,get_response),負(fù)責(zé)在web server啟動時完成初始化,即建立與下一層middleware的聯(lián)系.(2)__call__(self,request),在每次request下,被調(diào)用。

有三個可選的函數(shù):(1)process_view:__init__和__call__對view 方法一無所知,而process_view給了通道(give access to)在調(diào)用view方法之前獲曉view方法及其參數(shù),如果出現(xiàn)了,則它在__call__調(diào)用后,在self.get_response(request)之前調(diào)用,因此可以觸發(fā)view 方法。(2)process_exception:如果在view方法中出現(xiàn)異常,該函數(shù)可以提供機會來處理異常(3)process_template_response:在self.get_response(request)調(diào)用后,view方法結(jié)束后,提供修改response的機會,需要注意的是該函數(shù)僅僅在view方法返回的是TemplateResponse類的情況下有效,如果返回的是render() ,則該函數(shù)不被觸發(fā)。

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

運行后:

可以看到完成了既定的目標(biāo),request進來后,一層一層的進入,直到最內(nèi)層C,調(diào)用view方法,得到response,然后將response從最內(nèi)層一層一層的傳遞出來!

到此這篇關(guān)于理解Django 中Call Stack機制的小Demo的文章就介紹到這了,更多相關(guān)Django Call Stack機制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • OpenCV基礎(chǔ)HSV顏色空間*args與**kwargs滑動條傳參問題

    OpenCV基礎(chǔ)HSV顏色空間*args與**kwargs滑動條傳參問題

    這篇文章主要介紹了OpenCV基礎(chǔ)中HSV顏色空間*args與**kwargs滑動條傳參問題的詳細(xì)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • Python實現(xiàn)微信高效自動化操作

    Python實現(xiàn)微信高效自動化操作

    在如今數(shù)字化時代,人們對于效率的追求越來越強烈,而PyAutoGUI和Pyperclip作為Python中的兩個強大庫,為我們實現(xiàn)自動化操作提供了便利,下面我們就來看看如何利用這兩個庫實現(xiàn)微信自動化操作吧
    2023-10-10
  • 詳解python如何在django中為用戶模型添加自定義權(quán)限

    詳解python如何在django中為用戶模型添加自定義權(quán)限

    這篇文章主要介紹了python如何在django中為用戶模型添加自定義權(quán)限,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • 使用Python操作文件系統(tǒng)的方法

    使用Python操作文件系統(tǒng)的方法

    Python提供了許多內(nèi)置庫來處理文件系統(tǒng),如os、shutil和pathlib等,這些庫可以幫助你創(chuàng)建、刪除、讀取、寫入文件和目錄,這篇文章主要介紹了使用Python操作文件系統(tǒng),需要的朋友可以參考下
    2023-07-07
  • 獲取python文件擴展名和文件名方法

    獲取python文件擴展名和文件名方法

    本篇文章通過python寫一個獲取python文件擴展名和文件名的功能,并分享了代碼,有興趣的參考下。
    2018-02-02
  • 詳解如何理解并正確使用Python中的f字符串

    詳解如何理解并正確使用Python中的f字符串

    Python中的f字符串是一種字符串格式化語法,它可以將變量、表達(dá)式和函數(shù)等動態(tài)地嵌入到字符串中,本文就來詳細(xì)講講如何理解并正確使用它吧
    2023-06-06
  • 一小時學(xué)會TensorFlow2之自定義層

    一小時學(xué)會TensorFlow2之自定義層

    這篇文章主要介紹了TensorFlow2之自定義層,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • Python簡單實現(xiàn)Base64編碼和解碼的方法

    Python簡單實現(xiàn)Base64編碼和解碼的方法

    這篇文章主要介紹了Python簡單實現(xiàn)Base64編碼和解碼的方法,結(jié)合具體實例形式分析了Python實現(xiàn)base64編碼解碼相關(guān)函數(shù)與使用技巧,需要的朋友可以參考下
    2017-04-04
  • python爬蟲遇到403錯誤的問題及解決

    python爬蟲遇到403錯誤的問題及解決

    這篇文章主要介紹了python爬蟲遇到403錯誤的問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Python中字符串的修改及傳參詳解

    Python中字符串的修改及傳參詳解

    最近在一次使用python實現(xiàn)字符串反轉(zhuǎn)的時候,發(fā)現(xiàn)寫出的代碼居然是錯誤的,于是通過思考后決定要總結(jié)下這次的經(jīng)歷,于是寫了這篇文章,本文的內(nèi)容主要給大家介紹了Python中字符串的修改及傳參,有需要的朋友們可以參考借鑒,下面來一起學(xué)習(xí)學(xué)習(xí)吧。
    2016-11-11

最新評論

龙州县| 东丽区| 威海市| 宣化县| 临湘市| 额敏县| 鄂托克前旗| 赣榆县| 乌拉特前旗| 赤水市| 扶绥县| 黄龙县| 浦县| 来凤县| 内黄县| 永城市| 崇礼县| 延长县| 沈丘县| 马关县| 临江市| 芜湖县| 玉屏| 合阳县| 奉贤区| 长岛县| 巴南区| 明星| 客服| 都兰县| 正蓝旗| 刚察县| 布尔津县| 武山县| 靖宇县| 昔阳县| 赤城县| 融水| 玉溪市| 日照市| 千阳县|