2012-03-12 94 views
2

我有一個幾乎完整的簡單的網絡應用程序被編寫爲Python CGI腳本。我想將其改爲使用WSGI,但我無法找到幫助我理解WSGI實際是什麼的文檔(只能通過start_response等方式重複查找調用,但似乎沒有太多的解釋呼叫實際上是)。有人能指點我一個很好的解釋,再加上關於如何使用WSGI?需要一個好的初學者的WSGI指南

編輯:補充一點,我見過this question但答案似乎仍然不能告訴一個如何在直接腳本中使用WSGI(如在一個框架反對)。

+0

哎呀,我剛剛發現[本指南來自Armin Ronacher](http://lucumr.pocoo.org/2007/5/21/getting-started-with-wsgi/),這似乎是我一直在尋找。也推薦給其他人。我認爲,不能克服這個問題,所以要求其他人這樣做。 – ShankarG 2012-03-12 08:58:47

回答

8

WSGI是PEP 333(和Python3的PEP3333),也叫做Web服務器網關接口。它有三個部分,但您感興趣的部分是您如何編寫WSGI應用程序。 WSGI應用程序是一個可調用的對象,它接受兩個參數並返回一個可迭代的對象(或者是一個生成器)。

# this is my_app module 
def app(environ, start_response): 
    # environ is dict-like object containing the WSGI environment 
    # refer to the PEP for details 

    # start_response is a callable that, well, starts the response 
    headers = [('Content-Type', 'text/plain; charset=utf-8')] 
    start_response('200 OK', headers) 

    return ["I'm a WSGI application.\n"] 

要運行該應用程序,需要WSGI的另一部分,它是網關。在標準庫中你會發現wsgiref包。它包含一個CGI網關:

#!/usr/bin/python 
# this is a CGI script that runs a WSGI application inside CGI handler 
from wsgiref.handlers import CGIHandler 
from my_app import app 
CGIHandler().run(app) 

,也爲開發一個簡單的HTTP服務器:

from wsgiref.simple_server import make_server 
from my_app import app 
httpd = make_server('localhost', 8000, app) 
httpd.serve_forever() 

正如你所看到的,WSGI,可以重複使用在不同的環境中應用程序 - CGI,SCGI,FastCGI的,mod_wsgi,mod_python等,而不需要實際重寫它。

WSGI的最後一部分是中間件 - 基本上,它是一個允許您組合不同WSGI應用程序的概念。它形成了一種三明治 - 請求從頂層(網關)流向底層(通常是您的應用程序),其間有一些中間層,可以實現像數據庫連接池或會話之類的東西。 wsgiref包含一個這樣的中間件 - wsgiref.validate.validator,它檢查下面和上面的層是否符合WSGI規範的規則。

而基本上就是這樣。現在去使用一個框架。

+0

+1提供比我更詳細的地獄。對於「現在去使用一個框架」。 ;) – Amber 2012-03-12 09:02:23

+0

非常感謝您提供了一個非常好的答案 - 我正在尋找指南,但我認爲您已經在這裏給我答案!現在我打算讓應用程序WSGI和**然後**去使用一個框架。很多浪費時間,但我是這樣的老派:) – ShankarG 2012-03-12 09:06:15

+0

@ShankarG:大多數框架隱藏WSGI層,因爲它可能在複雜的應用程序中有點麻煩。 – 2012-03-12 09:07:51

0

嘗試直接轉到源代碼 - PEP 333,WSGI規範。