摘要:最新的工作中,有一部分的任務(wù),于是開始折騰先惡補理論吧,關(guān)于有篇需要看,和,前者是年的提案,后者在年對前者做了小幅修訂,提案狀態(tài)也已經(jīng)是,所以已經(jīng)不是提案,已經(jīng)是協(xié)議規(guī)范了,是的縮寫,解決的是各種比如與各種框架比如之間互聯(lián)互通的兼容性問題如
最新的工作中,有一部分HTTP API的任務(wù),于是開始折騰Python WSGI...
WSGI先惡補理論吧,關(guān)于Python WSGI有2篇PEP需要看,PEP 0333和PEP 3333,前者是2003年的提案,后者在2010年對前者做了小幅修訂,提案狀態(tài)也已經(jīng)是“Final”,所以已經(jīng)不是“提案”,已經(jīng)是協(xié)議規(guī)范了;
WSGI,是“Python Web Server Gateway Interface”的縮寫,解決的是各種Web Server(比如Apache、Nginx)與各種Python Web框架(比如Flask、Tornado)之間互聯(lián)互通的兼容性問題;
如PEP中描述,在沒有一個統(tǒng)一協(xié)議規(guī)范以前,某個Python應(yīng)用(Web框架、或者應(yīng)用程序),可能僅支持運行在某一個Web Server下,應(yīng)用開發(fā)者選擇某個Web框架的同時,也就綁死了某個Web Server;另外,在某個Web框架寫的應(yīng)用代碼,遷移到另外一個Web框架,不一定能跑起來;所以,為了能讓用戶自由選擇、組合使用任意的Web框架和Web Server,該PEP規(guī)范了必要的交互方式和數(shù)據(jù)結(jié)構(gòu);
注意,WSGI不是一個軟件工具,它是一種協(xié)議規(guī)范的描述,它規(guī)范了“交互方式和數(shù)據(jù)結(jié)構(gòu)”,任何Web Server、Gateway和Framework、Application,只要遵從這個規(guī)范去實現(xiàn),就一定能互聯(lián)互通;既然是“交互”,就一定至少包含兩方吧,PEP指出:
the "server" or "gateway" side(下文稱為“server端”)
the "application" or "framework" side(下文稱為“application端”,framework本質(zhì)上也是一種應(yīng)用)
“application端”,必須提供一個“可調(diào)用的對象”供“server端”調(diào)用,“可調(diào)用的對象”一般是個入口函數(shù),應(yīng)用對HTTP請求的處理,要在這個入口函數(shù)內(nèi)完成,函數(shù)最終返回HTTP Respone,比如生成的HTML;
下面的示例摘自PEP 3333:
pythonHELLO_WORLD = b"Hello world! " def simple_app(environ, start_response): """Simplest possible application object""" status = "200 OK" response_headers = [("Content-type", "text/plain")] start_response(status, response_headers) return [HELLO_WORLD]
“server端”,一般就是Web Server啦,最主要的任務(wù)就是接受到HTTP請求后,調(diào)用“application端提供的入口函數(shù)(比如上面的“simple_app”),另外應(yīng)用程序里可能需要很多HTTP請求的信息(比如HTTP Method,GET/POST),這些信息,如何獲取呢?需要“server端”在調(diào)用應(yīng)用入口函數(shù)的時候作為函數(shù)參數(shù)傳遞,就是上面的“environ”,關(guān)于“environ”這個數(shù)據(jù)結(jié)構(gòu)的規(guī)范,PEP中也是有詳細描述的;
關(guān)于“server端”實現(xiàn)的實例代碼,稍稍復(fù)雜一點,搬運到這里,也不見得幫助理解,自行到PEP 3333查閱吧;
關(guān)于Python WSGI的理論介紹,最核心的都在這兒了,更細節(jié)的協(xié)議介紹,自行查閱吧;
Quick Start好了,終于可以動手實踐了,早已按耐不住啦!我們先把上面的“simple_app”跑起來吧;
bash$ touch simple_app.py $ vim simple_app.py HELLO_WORLD = b"Hello world! " def application(environ, start_response): """Simplest possible application object""" status = "200 OK" response_headers = [("Content-type", "text/plain")] start_response(status, response_headers) return [HELLO_WORLD]
好了,“application端”已經(jīng)好了,那“server端”呢?我們需要搞來一個實現(xiàn)了Python WSGI的Web Server,這里,我選擇了,uWSGI,不要被它的名字迷惑,它其實是一個功能非常全、實現(xiàn)了各種協(xié)議、支持各種的語言的“a full stack for building hosting services”,因為最早支持Python,所以取了這樣一個名字,官方都說,名字已經(jīng)支撐不起它的野心,哈哈;
本實踐中,我們要基于Python安裝uWSGI:
bash$ pip install uwsgi
根據(jù)你的Python安裝路徑,uWSGI的二進制程序安裝路徑也會不同,比我電腦上:
bash$ ls /usr/local/python2.7/bin/uwsgi
現(xiàn)在,“application端”和“server端”,都已經(jīng)準(zhǔn)備就緒了,我們可以啟動的這個簡單的WSGI應(yīng)用了:
bashuwsgi --http :9090 --wsgi-file simple_app.py
uWSGI會到simple_app.py文件中,找一個固定名字“application”的入口函數(shù),當(dāng)uWSGI收到HTTP請求時,就會調(diào)用該入口函數(shù);
你在瀏覽器請求http://127.0.0.1:9090,應(yīng)該會看到uWSGI的輸出:
bash$ uwsgi --http :9090 --wsgi-file simple_app.py [pid: 1492|app: 0|req: 1/1] 127.0.0.1 () {34 vars in 626 bytes} [Sat Jun 20 15:32:14 2015] GET / => generated 11 bytes in 0 msecs (HTTP/1.1 200) 1 headers in 44 bytes (1 switches on core 0) [pid: 1492|app: 0|req: 2/2] 127.0.0.1 () {36 vars in 615 bytes} [Sat Jun 20 15:32:14 2015] GET /favicon.ico => generated 11 bytes in 0 msecs (HTTP/1.1 200) 1 headers in 44 bytes (1 switches on core 0)
此時,你的瀏覽器應(yīng)該也已經(jīng)有“Hello World”頁面輸出,大功告成!
Learn More本文的“Hello World”示例,僅僅是展示Python WSGI的框架結(jié)構(gòu),“server端”提供的HTTP請求信息“environ”完全沒有使用,無腦返回一個不變的字符串;
真正的應(yīng)用,是需要根據(jù)功能要求,定制、填充那個application的入口函數(shù)的,應(yīng)用開發(fā)者,可以自己代碼實現(xiàn),也可以依托于一些流行的WSGI框架和Python模塊,比如:Flask框架、werkzeug
“server端”就沒有什么發(fā)揮的空間了,選擇一個支持WSGI協(xié)議的就好了,就像本文嘗試的uWSGI,除非你想自己實現(xiàn)個Web Server;Nginx雖然不直接支持WSGI,但它支持uWSGI,這樣把Nginx擋在uWSGI前面,uWSGI就可以專門處理動態(tài)的WSGI請求了,形成的架構(gòu),非常類似于PHP場景下的Nginx+PHP-FPM;
這些方面的知識,也許會有后續(xù)的文章做介紹;
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/45372.html
摘要:通過查閱了些資料,總算把它們的關(guān)系理清了。在這個過程中,服務(wù)器的作用是接收請求處理請求返回響應(yīng)服務(wù)器是一類特殊的服務(wù)器,其作用是主要是接收請求并返回響應(yīng)。正是為了替代而出現(xiàn)的。三結(jié)語最后以,,之間的對話結(jié)束本文。 剛轉(zhuǎn)行互聯(lián)網(wǎng)行業(yè),聽到了許多名詞:Flask、Django、WSGI、 Nginx、Apache等等,一直無法搞清楚這些開源項目之間的關(guān)系,直至看到這篇文章后感覺醍醐灌頂,以...
摘要:本文主要分析的是庫的這個模塊中的代碼。將結(jié)果轉(zhuǎn)換成一個迭代器。函數(shù)函數(shù)的定義如下位置位置位置該函數(shù)的參數(shù)中就是,是路由映射表則是,是本次請求路徑。位置,如果是其他情況,比如直接指定一個類對象作為處理對象。 本文主要分析的是web.py庫的application.py這個模塊中的代碼??偟膩碚f,這個模塊主要實現(xiàn)了WSGI兼容的接口,以便應(yīng)用程序能夠被WSGI應(yīng)用服務(wù)器調(diào)用。WSGI是We...
摘要:概述接口包含兩方面及。另外在和之間還可能有一種稱作的中間件。接收的返回值作為響應(yīng)體。假設(shè)一個符合標(biāo)準(zhǔn)的可調(diào)用對象,它接受可調(diào)用對象作為參數(shù),返回一個可調(diào)用對象的對象。這樣的可調(diào)用對象稱為。的概念非常接近。 概述 WSGI接口包含兩方面:server/gateway 及 application/framework。 server調(diào)用由application提供的可調(diào)用對象。 另外在se...
摘要:在介紹之前,先介紹一下,它為語言定義的服務(wù)器和應(yīng)用程序或框架之間的一種簡單而通用的接口。這個函數(shù)接受兩個參數(shù),分別是和。響應(yīng)對象是一個應(yīng)用,提供了更好的方法來創(chuàng)建響應(yīng)。這部分解釋來源于官方文檔的中文版。 Werkzeug 是一個WSGI工具包,也可以作為一個Web框架的底層庫。 WSGI 在介紹Werkzeug之前,先介紹一下 WSGI(Python Web Server Gate...
閱讀 3451·2021-09-26 09:46
閱讀 2799·2021-09-13 10:23
閱讀 3535·2021-09-07 10:24
閱讀 2404·2019-08-29 13:20
閱讀 2930·2019-08-28 17:57
閱讀 3083·2019-08-26 13:27
閱讀 1189·2019-08-26 12:09
閱讀 517·2019-08-26 10:27