天天看點

戲說WSGI(Python Web服務網關接口)--[轉載]

當你在python的世界中冒險,突然遭遇一隻web怪獸,你會選擇什麼武器對付它?在兵器譜上,下列兵器可謂名列前茅:

zope,厚重的長槍。較早出現的武器形态。該武器非常之強悍,無堅不摧,無物不破。而且适合在軍隊中使用,排兵布陣集團作戰效果更佳。然而要用好zope要花上很長的時間,俗話說“月棍年刀一輩子槍”,可見其難度。

turbogears,威武的刀。快意江湖必備之物。其打造者熟知江湖規矩,頗有武林盟主之風,遇事通常拉幫結夥,分派任務,決計不會把所有事情都攬在自己身上。

django,飄逸的劍。非常内斂,據說使用該武器的高手通常是獨行俠,他們的格言是:一劍在手,夫複何求?

web.py,小巧的匕首,刺客的最愛。常被用來執行特殊任務。

pylons,詭異的鞭, 傳言是ruby世界的rails披上了python的外衣,使用起來一定要小心,因為你不知道它會纏住敵人的脖子還是自己的脖子。

然而,我們今天要說的并不是這些武器,而是一種心法。畢竟武器的使用隻是“招法”,而心法是招法的靈魂,心法一通,招法百通。這就是由馬裡奧創造的“管道心法”,西方大陸稱其為wsgi(python web服務網關接口)。

wsgi是馬裡奧在探索管道的時候發現的一種連接配接件,它非常簡單,入口處提供一個start_response,用于回流(回 調,callback),入口會連接配接到出口的一個函數,并傳遞environ字典和start_response作為參數;而出口處的函數先是調用 start_response并傳遞status和header,然後再傳回content。由于這段心法有些拗口,馬裡奧示範了唯一的招式,并聲明其實 所有的招式都可以從這招中演化出來:

馬裡奧還發現,wsgi其實可以串聯起來,為了區分,馬裡奧将下水管的入口叫做web server,隻能接受外界的請求并調用下一段管件的函數;中間的管件叫做middleware,既可以接收上一段管件的請求,又可以調用下一段管件的函數;管道的終點叫做web app,隻能被上一段管件調用。

為了避免後人誤解,馬裡奧最後強調:武器是死的,好的武器隻有在合适的人手裡才能發揮最大的威力,争執于武器的好壞毫無意義。

馬裡奧最後将這段心法奉獻給了pep,pep将其編号為333。