首先這是網(wǎng)絡編程的范疇呵燕,因此來了解一下這部分的知識。
首先件相,要在網(wǎng)絡上進行通信再扭,就需要有相關網(wǎng)絡協(xié)議。
TCP/IP夜矗,UDP……等等泛范。
當然你可以說我直接選用一個框架作為開始,不想了解這么多東西紊撕。那樣也沒問題罢荡,不過到一定的時間,相信你還是會愿意回過頭來看一看這些基礎知識的对扶。
提到網(wǎng)絡編程区赵,你一定見過Socket,翻譯過來是套接字辩稽。這個是啥惧笛,相信你也和我一樣在初見到它的時候一頭霧水,我覺得是翻譯的不好逞泄,引用一段我覺得還算不錯的解釋:
Socket是網(wǎng)絡編程的一個抽象概念患整。通常我們用一個Socket表示“打開了一個網(wǎng)絡鏈接”,而打開一個Socket需要知道目標計算機的IP地址和端口號喷众,再指定協(xié)議類型即可各谚。
那么,拋開各種框架不談到千,直接用Python去進行網(wǎng)絡編程時昌渤,一般會用到socket模塊。具體示例代碼憔四,我隨便找了本書上的偽代碼抄在下面剃允。
創(chuàng)建TCP服務器
ss = socket() # 創(chuàng)建服務器套接字
ss.bind() # 套接字與地址綁定
ss.listen() # 監(jiān)聽連接
inf_loop:# 服務器無限循環(huán)
cs = ss.accept() # 接受客戶端連接
comm_loop:# 通信循環(huán)
cs.recv()/cs.send() # 對話(接收/發(fā)送)
cs.close()# 關閉客戶端套接字
ss.close()# 關閉服務器套接字#(可選)
創(chuàng)建TCP客戶端
cs = socket() # 創(chuàng)建客戶端套接字
cs.connect() # 嘗試連接服務器
comm_loop:# 通信循環(huán)
cs.send()/cs.recv() # 對話(發(fā)送/接收)
cs.close()# 關閉客戶端套接字
流程是這樣:先創(chuàng)建一個服務器端辅斟,再創(chuàng)建一個客戶端,
然后它們開始參與發(fā)送和接收的對話,直到連接終止毛俏。
具體操作的時候宦赠,我們需要打開兩個命令行窗口胸嘴,一個運行服務器程序券犁,另一個運行客戶端程序,就可以看到對話的效果了。
到這里你應該有了一個大致的概念:在網(wǎng)絡上通信裁替,需要通信的雙方项玛,以及網(wǎng)絡協(xié)議,然后建立起聯(lián)系弱判。
Web開發(fā)
Web當然是網(wǎng)絡的一部分襟沮。
在Web應用中,服務器把網(wǎng)頁傳給瀏覽器裕循,實際上就是把網(wǎng)頁的HTML代碼發(fā)送給瀏覽器臣嚣,讓瀏覽器顯示出來。而瀏覽器和服務器之間的傳輸協(xié)議是HTTP剥哑,所以:
- HTML是一種用來定義網(wǎng)頁的文本硅则,會HTML,就可以編寫網(wǎng)頁株婴;
- HTTP是在網(wǎng)絡上傳輸HTML的協(xié)議怎虫,用于瀏覽器和服務器的通信。
看來困介,HTTP協(xié)議是Web開發(fā)中大审,十分重要的協(xié)議了。
關于HTTP協(xié)議的具體知識座哩,推薦一本書《圖解HTTP協(xié)議》徒扶。
因此,在Web應用中根穷,經(jīng)常在做接受HTTP請求姜骡、解析HTTP請求、發(fā)送HTTP響應這些苦力活屿良。所以圈澈,如果需要自己動手實現(xiàn),就得接觸到TCP連接尘惧、HTTP原始請求和響應格式康栈,估計還得閱讀不少相關規(guī)范。
WSGI
可是大部分Web應用的開發(fā)者并不想把時間耗費在這些苦力活上喷橙,因此啥么,WSGI應運而生了。其全稱是Web Server Gateway Interface贰逾。
WSGI接口定義非常簡單饥臂,它只要求Web開發(fā)者實現(xiàn)一個函數(shù),就可以響應HTTP請求似踱。
Python也內(nèi)置了一個WSGI服務器,這個模塊叫wsgiref,它是用純Python編寫的WSGI服務器的參考實現(xiàn)核芽。所謂“參考實現(xiàn)”是指該實現(xiàn)完全符合WSGI標準囚戚,但是不考慮任何運行效率,僅供開發(fā)和測試使用轧简。
了解了WSGI框架驰坊,我們發(fā)現(xiàn):其實一個Web App,就是寫一個WSGI的處理函數(shù)哮独,針對每個HTTP請求進行響應拳芙。
但是當HTTP請求、URL多起來的時候皮璧,問題又出現(xiàn)了:如何處理URL和處理函數(shù)之間的映射關系舟扎?
WSGI提供的接口雖然比HTTP接口高級了不少,但和Web App的處理邏輯比悴务,還是比較低級睹限,我們需要在WSGI接口之上能進一步抽象,讓我們專注于用一個函數(shù)處理一個URL讯檐,至于URL到函數(shù)的映射羡疗,就交給Web框架來做。
因此别洪,Python內(nèi)置的WSGI服務器當然不足以滿足許多人的需要叨恨,好在我們還有其他的框架可以選用。
Web框架
目前運行在WSGI協(xié)議之上的Web框架非常多挖垛。從個人經(jīng)驗角度而言:輕量級選Flask痒钝、重量級選Django,當然還有其他的晕换,不過我沒有去深入了解午乓,各位可以自行搜索。
學習它們的教程也很多闸准,比如Flask就有“狼書”《Flask Web開發(fā)實戰(zhàn):入門益愈、進階與原理解析》、“狗書”《Flask Web開發(fā):基于Python的Web應用開發(fā)實戰(zhàn)》等不錯的參考書籍夷家。
當然蒸其,這些框架也都對WSGI進行了各自的實現(xiàn)。
因為每個Web框架都不是專注于實現(xiàn)服務器方面的库快,所以這些WSGI服務器一般也就是開發(fā)調(diào)試時使用摸袁。在生產(chǎn)環(huán)境部署的時候,不會簡單的使用Web框架自帶的服務器义屏。
實際環(huán)境使用的WSGI服務器
- Gunicorn
最流行的大概就是這個了吧靠汁。
- uwsgi
因為使用C語言開發(fā)蜂大,會和底層接觸的更好。
一般生產(chǎn)環(huán)境上蝶怔,也就是二者選其一了奶浦。我目前在用的是Gunicorn。
小結
閱讀完這篇文章踢星,你應該能夠從網(wǎng)絡編程的基本原理澳叉,到框架選用,再到生產(chǎn)環(huán)境的部署沐悦,都有了相關概念了成洗。
除了沒有告訴你怎么具體寫一個請求處理函數(shù)以外,其他周邊知識你都清楚了哦藏否?如果還有問題瓶殃,歡迎留言。
參考文獻:
http://python.jobbole.com/88653/
http://python.jobbole.com/88447/?utm_source=blog.jobbole.com&utm_medium=relatedPosts
https://www.liaoxuefeng.com
《Python核心編程(第3版)》