2012-05-15 60 views
11

我想了解WSGI的功能並需要一些幫助。瞭解WSGI

到目前爲止,我知道它是一種服務器和應用程序之間的中間件,用於與應用程序連接不同的應用程序框架(位於服務器端),前提是有問題的框架具有WSGI適配器。繼續理論部分,我知道爲了服務器與應用程序通信,服務器調用一個可調用對象(它有兩個參數:環境變量和start_response函數)。這裏,start_response函數由服務器(?)提供,並由應用程序使用,響應狀態和標題後跟響應主體。

我對上面寫的東西一無所知,所以這裏是新手問題: 1)什麼是一般的呼叫流程?應用程序將爲服務器提供可調用的服務器,然後服務器將調用使用該可調用的應用程序並使用env_vars和start_response函數作爲參數?

2)最讓我困惑的是應用程序發送請求頭,然後它也發送響應正文。這是什麼類型的請求?

請賜教,因爲我無法讓我的頭靠近這個東西。

謝謝!

+1

既然你不說你至今讀到的東西,保證你看過實際PEP如果你還沒有。 http://www.python.org/dev/peps/pep-3333/ –

回答

7

的呼叫流程如下:

  1. 服務器有一個HTTP連接,
  2. 服務器解析HTTP請求行和標題,閱讀身體,
  3. 服務器填充ENVIRON字典根據請求,
  4. 服務器調用應用程序可調用environstart_response作爲參數,
  5. 應用程序調用,調用start_response與響應狀態和響應頭,
  6. 應用程序返回響應體到服務器,
  7. 服務器發送HTTP響應到客戶端。

對於第二個問題,請求/響應是由wsgi協議定義的接口(例如status ='200 OK',response_headers = [('Content-type','text/plain')]),與http請求/響應不一樣。

您可以瀏覽支架庫模塊wsgiref作爲參考。

+0

所以這一切都在一個單一的過程? (應用程序和Web服務器) – Pynchia

+0

步驟4必須在單個進程中。但是接受http連接的服務器可以是另一個過程,例如它可以使用fastcgi,scgi等協議將請求信息傳遞給另一個進程。 – freestyler

+0

謝謝,但它有助於澄清哪些進程(OS進程)涉及到哪個點。例如,在apache w/mod_wsgi作爲守護進程的情況下。每個請求都會由同一個進程處理嗎? python在哪裏執行? – Pynchia