首先這是網(wǎng)絡(luò)編程的范疇,因此來了解一下這部分的知識(shí)。
網(wǎng)絡(luò)協(xié)議
首先,要在網(wǎng)絡(luò)上進(jìn)行通信,就需要有相關(guān)網(wǎng)絡(luò)協(xié)議,例如TCP/IP,UDP……等等。
當(dāng)然你可以說我直接選用一個(gè)框架作為開始,不想了解這么多東西。那樣也沒問題,不過到一定的時(shí)間,相信你還是會(huì)愿意回過頭來看一看這些基礎(chǔ)知識(shí)的。
提到網(wǎng)絡(luò)編程,你一定見過Socket,翻譯過來是套接字。這個(gè)是啥,相信你也和我一樣在初見到它的時(shí)候一頭霧水,我覺得是翻譯的不好,引用一段我覺得還算不錯(cuò)的解釋:
Socket是網(wǎng)絡(luò)編程的一個(gè)抽象概念。通常我們用一個(gè)Socket表示“打開了一個(gè)網(wǎng)絡(luò)鏈接”,而打開一個(gè)Socket需要知道目標(biāo)計(jì)算機(jī)的IP地址和端口號(hào),再指定協(xié)議類型即可。
那么,拋開各種框架不談,直接用Python去進(jìn)行網(wǎng)絡(luò)編程時(shí),一般會(huì)用到socket模塊。具體示例代碼,我隨便找了本書上的偽代碼抄在下面。
流程是這樣:先創(chuàng)建一個(gè)服務(wù)器端,再創(chuàng)建一個(gè)客戶端,
然后它們開始參與發(fā)送和接收的對(duì)話,直到連接終止。
具體操作的時(shí)候,我們需要打開兩個(gè)命令行窗口,一個(gè)運(yùn)行服務(wù)器程序,另一個(gè)運(yùn)行客戶端程序,就可以看到對(duì)話的效果了。
到這里你應(yīng)該有了一個(gè)大致的概念:在網(wǎng)絡(luò)上通信,需要通信的雙方,以及網(wǎng)絡(luò)協(xié)議,然后建立起聯(lián)系。
Web開發(fā)
Web當(dāng)然是網(wǎng)絡(luò)的一部分。
在Web應(yīng)用中,服務(wù)器把網(wǎng)頁傳給瀏覽器,實(shí)際上就是把網(wǎng)頁的HTML代碼發(fā)送給瀏覽器,讓瀏覽器顯示出來。而瀏覽器和服務(wù)器之間的傳輸協(xié)議是HTTP,所以:
看來,HTTP協(xié)議是Web開發(fā)中,十分重要的協(xié)議了。
關(guān)于HTTP協(xié)議的具體知識(shí),推薦一本書《圖解HTTP協(xié)議》。
因此,在Web應(yīng)用中,經(jīng)常在做接受HTTP請(qǐng)求、解析HTTP請(qǐng)求、發(fā)送HTTP響應(yīng)這些苦力活。所以,如果需要自己動(dòng)手實(shí)現(xiàn),就得接觸到TCP連接、HTTP原始請(qǐng)求和響應(yīng)格式,估計(jì)還得閱讀不少相關(guān)規(guī)范。
WSGI
可是大部分Web應(yīng)用的開發(fā)者并不想把時(shí)間耗費(fèi)在這些苦力活上,因此,WSGI應(yīng)運(yùn)而生了。其全稱是Web Server Gateway Interface。
WSGI接口定義非常簡(jiǎn)單,它只要求Web開發(fā)者實(shí)現(xiàn)一個(gè)函數(shù),就可以響應(yīng)HTTP請(qǐng)求。
Python也內(nèi)置了一個(gè)WSGI服務(wù)器,這個(gè)模塊叫wsgiref,它是用純Python編寫的WSGI服務(wù)器的參考實(shí)現(xiàn)。所謂“參考實(shí)現(xiàn)”是指該實(shí)現(xiàn)完全符合WSGI標(biāo)準(zhǔn),但是不考慮任何運(yùn)行效率,僅供開發(fā)和測(cè)試使用。
了解了WSGI框架,我們發(fā)現(xiàn):其實(shí)一個(gè)Web App,就是寫一個(gè)WSGI的處理函數(shù),針對(duì)每個(gè)HTTP請(qǐng)求進(jìn)行響應(yīng)。
但是當(dāng)HTTP請(qǐng)求、URL多起來的時(shí)候,問題又出現(xiàn)了:如何處理URL和處理函數(shù)之間的映射關(guān)系?
WSGI提供的接口雖然比HTTP接口高級(jí)了不少,但和Web App的處理邏輯比,還是比較低級(jí),我們需要在WSGI接口之上能進(jìn)一步抽象,讓我們專注于用一個(gè)函數(shù)處理一個(gè)URL,至于URL到函數(shù)的映射,就交給Web框架來做。
因此,Python內(nèi)置的WSGI服務(wù)器當(dāng)然不足以滿足許多人的需要,好在我們還有其他的框架可以選用。
Web框架
目前運(yùn)行在WSGI協(xié)議之上的Web框架非常多。從個(gè)人經(jīng)驗(yàn)角度而言:輕量級(jí)選Flask、重量級(jí)選Django,當(dāng)然還有其他的,不過我沒有去深入了解,各位可以自行搜索。
學(xué)習(xí)它們的教程也很多,比如Flask就有“狼書”《Flask Web開發(fā)實(shí)戰(zhàn):入門、進(jìn)階與原理解析》、“狗書”《Flask Web開發(fā):基于Python的Web應(yīng)用開發(fā)實(shí)戰(zhàn)》等不錯(cuò)的參考書籍。
當(dāng)然,這些框架也都對(duì)WSGI進(jìn)行了各自的實(shí)現(xiàn)。
因?yàn)槊總€(gè)Web框架都不是專注于實(shí)現(xiàn)服務(wù)器方面的,所以這些WSGI服務(wù)器一般也就是開發(fā)調(diào)試時(shí)使用。在生產(chǎn)環(huán)境部署的時(shí)候,不會(huì)簡(jiǎn)單的使用Web框架自帶的服務(wù)器。
實(shí)際環(huán)境使用的WSGI服務(wù)器
最流行的大概就是這個(gè)了吧。
因?yàn)槭褂肅語言開發(fā),會(huì)和底層接觸的更好。
一般生產(chǎn)環(huán)境上,也就是二者選其一了。我目前在用的是Gunicorn。
小結(jié)
閱讀完這篇文章,你應(yīng)該能夠從網(wǎng)絡(luò)編程的基本原理,到框架選用,再到生產(chǎn)環(huán)境的部署,都有了相關(guān)概念了。
除了沒有告訴你怎么具體寫一個(gè)請(qǐng)求處理函數(shù)以外,其他周邊知識(shí)你都清楚了哦?如果還有問題,歡迎留言。
聯(lián)系客服