WSGI與ASGI的區別與聯繫

WSGI與ASGI

什麼是WSGI

CGI(Common Gateway Interface,通用網關接口),定義客戶端與Web服務器的交流方式的一個程序,例如正常情況下客戶端發送過來一個請求,根據HTTP協議Web服務器將請求的內容解析出來,經過處理會後,再將返回的內容封裝好。例如服務器返回一個HTML頁面,並且根據HTTP協議構建返回內容的響應格式,涉及到TCP連接、HTTP原始請求和相應格式都是由一個軟件來完成,這個程序就是CGI。

那麼WSGI(Python Web Server Gateway Interface,WSGI)Web服務器網關接口,是爲Python語言定義的Web服務器和Web應用程序或框架之間的一猴子那個簡單而且通用的接口,從語義上理解,WSGI爲了解決Web服務器與客戶端之間的通信問題而產生的。並且WSGI是基於現存的CGI標準而設計的,同樣是一種程序。

WSGI區分爲兩部分,一種爲服務器或網關,另一種爲應用程序或應用框架,所謂的WSGI中間件同時實現了API的兩方,即在WSGI服務器和WSGI應用之間起調解作用:從WSGI服務器的角度來說,中間件扮演應用程序,而從應用程序的角度來說,中間件扮演服務器。中間件具有的功能有:

  • 重寫環境變量後,根據目標URL,將請求消息路由到不同的應用對象。
  • 允許在一個進程中同時運行多個應用程序或應用框架。
  • 負載均衡和遠程處理,通過在網絡上轉發請求和相應消息。
  • 進行內容後處理,例如應用樣表。

WSGI就是基於Python的以CGI爲標準做一些擴展。

在這裏插入圖片描述

什麼是ASGI

在這裏插入圖片描述

WSGI 規範自誕生以來應用廣泛,在作爲 Python 框架和 web 服務的選擇上擁有非常好的靈活性。但,因爲是針對 HTTP 風格的請求響應模型做的設計,加上越來越多不遵循這種模式的協議逐漸成爲 web 編程的標準之一,比如說,WebSocket。所以需要新的改變。

ASGI 嘗試保持在一個簡單的應用接口的前提下,提供允許數據能夠在任意時候、被任意應用進程發送和接受的抽象。
它同樣描繪了一個新的,兼容 HTTP 請求響應以及 WebSocket 數據幀的序列格式。允許這些協議能通過網絡或本地 socket 進行傳輸,以及讓不同的協議被分配到不同的進程進行處理。

目的

介於網絡協議服務和 Python 應用之間的標準接口,能夠處理多種通用協議類型,包括 HTTP、HTTP2 和 WebSocket。在 WSGI 上進行拓展,並最終取代它。在設計上還是包含了 WSGI 到 ASGI 以及 ASGI 到 WSGI 的轉換器,目的是爲了使 HTTP 協議的編寫更爲容易。

總覽

SGI 由三個不同的組件構成:協議服務、頻道層(channel layer)、應用代碼。頻道層是這個實現中最重要的部分,它能同時對協議服務和應用提供接口。

一個頻道層對協議服務、應用服務提供一個 send 的可調用方法,該方法接受 channel namemessage dict 以及一個 receive_many 方法作爲參數。receive_many 方法接受 channel namelist 作爲參數,返回指定頻道的下一條可用的消息。
所以,相較於在 WSGI 上,我們將協議服務直接指向應用,在 ASGI 裏,我們將協議服務和應用同時指向一個頻道層的實例。它的目的是讓應用服務和協議服務總是運行在不同的進程或者線程中,並通過頻道層進行通信。

區別

總體來說就是ASGI對於WSGI原有的模式的支持和WebSocket的擴展,即ASGI是WSGI的擴展。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章