摘要:服務(wù)器通過協(xié)議與客戶端通信,因此也被稱為服務(wù)器。本文標(biāo)題為從零開始搭建論壇一服務(wù)器與框架本文鏈接為更多閱讀自己動(dòng)手開發(fā)網(wǎng)絡(luò)服務(wù)器一自己動(dòng)手開發(fā)網(wǎng)絡(luò)服務(wù)器二自己動(dòng)手開發(fā)網(wǎng)絡(luò)服務(wù)器三服務(wù)器網(wǎng)關(guān)接口實(shí)現(xiàn)原理分析最佳實(shí)踐指南應(yīng)用淺談框架編程簡(jiǎn)介
之前用 Django 做過一個(gè)小的站點(diǎn),感覺Django太過笨重,于是就準(zhǔn)備換一個(gè)比較輕量級(jí)的 Web 框架來玩玩。Web.py 作者已經(jīng)掛掉,項(xiàng)目好久沒有更新,所以不準(zhǔn)備用它。而 Flask 也是一個(gè)成熟的輕量級(jí) Web 框架,在 github 上有眾多的 Star 和 Fork,文檔和擴(kuò)展也很豐富,值得學(xué)習(xí)。
學(xué)習(xí)一個(gè)框架最好的方式就是用框架做一個(gè)項(xiàng)目,在實(shí)戰(zhàn)中理解掌握框架。這里我用 Flask 框架,使用 Mysql 數(shù)據(jù)庫做了一個(gè)論壇系統(tǒng)。麻雀雖小,五臟俱全,論壇效果圖如下:
下面是論壇的基本功能:
完整的用戶模塊(注冊(cè)、登錄,更改、找回密碼、信息修改、站內(nèi)消息通知);
豐富的論壇模塊(創(chuàng)建、回復(fù)話題,站內(nèi)搜索,markdown支持,@user 提醒);
強(qiáng)大的后臺(tái)管理,支持屏蔽用戶、話題、評(píng)論,支持各種條件搜索話題、評(píng)論;
本博客將會(huì)用一系列文章,記錄論壇系統(tǒng)搭建的過程,希望對(duì)剛?cè)腴TWeb開發(fā)的同學(xué)有所幫助。
我們經(jīng)常聽說 Django, Flask 這些 python 語言的Web 框架,那么框架到底是什么,Web框架和Web服務(wù)器(Nginx, Apache等)有什么區(qū)別?離開框架還能用 Python 搭建Web站點(diǎn)嗎?要解決這些疑問,我們有必要來理解下 Web 服務(wù)器的工作原理,以及 Web 框架的本質(zhì)。
Web 服務(wù)器當(dāng)我們?cè)跒g覽器輸入U(xiǎn)RL后,瀏覽器會(huì)先請(qǐng)求DNS服務(wù)器,獲得請(qǐng)求站點(diǎn)的 IP 地址。然后發(fā)送一個(gè)HTTP Request(請(qǐng)求)給擁有該 IP 的主機(jī),接著就會(huì)接收到服務(wù)器給我們的 HTTP Response(響應(yīng)),瀏覽器經(jīng)過渲染后,以一種較好的效果呈現(xiàn)給我們。這個(gè)過程中,正是Web服務(wù)器在幕后默默做貢獻(xiàn)。
簡(jiǎn)單來說,Web服務(wù)器是在運(yùn)行在物理服務(wù)器上的一個(gè)程序,它永久地等待客戶端(主要是瀏覽器,比如Chrome,F(xiàn)irefox等)發(fā)送請(qǐng)求。當(dāng)收到請(qǐng)求之后,它會(huì)生成相應(yīng)的響應(yīng)并將其返回至客戶端。Web服務(wù)器通過HTTP協(xié)議與客戶端通信,因此也被稱為HTTP服務(wù)器。
Web服務(wù)器的工作原理并不復(fù)雜,一般可分成如下4個(gè)步驟:建立連接、請(qǐng)求過程、應(yīng)答過程以及關(guān)閉連接。
建立連接:客戶機(jī)通過TCP/IP協(xié)議建立到服務(wù)器的TCP連接。
請(qǐng)求過程:客戶端向服務(wù)器發(fā)送HTTP協(xié)議請(qǐng)求包,請(qǐng)求服務(wù)器里的資源文檔。
應(yīng)答過程:服務(wù)器向客戶機(jī)發(fā)送HTTP協(xié)議應(yīng)答包,如果請(qǐng)求的資源包含有動(dòng)態(tài)語言的內(nèi)容,那么服務(wù)器會(huì)調(diào)用動(dòng)態(tài)語言的解釋引擎負(fù)責(zé)處理“動(dòng)態(tài)內(nèi)容”,并將處理得到的數(shù)據(jù)返回給客戶端。由客戶端解釋HTML文檔,在客戶端屏幕上渲染圖形結(jié)果。
關(guān)閉連接:客戶機(jī)與服務(wù)器斷開。
下面我們實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 Web 服務(wù)器。運(yùn)行示例程序后,會(huì)監(jiān)聽本地端口 8000,在瀏覽器訪問 http://localhost:8000 就能看到響應(yīng)內(nèi)容。而我們的程序也能夠打印出客戶端發(fā)來的請(qǐng)求內(nèi)容,如下圖:
這里Request 和 Response 都需要遵守 HTTP 協(xié)議,關(guān)于 HTTP 協(xié)議的詳細(xì)內(nèi)容,可以讀讀《HTTP 權(quán)威指南》,或者看我整理的HTTP 部分內(nèi)容。
雖然說web服務(wù)器的主要工作是根據(jù)request返回response,但是實(shí)際中的 Web 服務(wù)器遠(yuǎn)遠(yuǎn)比上面示例的復(fù)雜的多,因?yàn)橐紤]的因素實(shí)在是太多了,比如:
緩存機(jī)制:講一些經(jīng)常被訪問的頁面緩存起來,提高響應(yīng)速度;
安全:防止黑客的各種攻擊,比如 SYN Flood 攻擊;
并發(fā)處理:如何響應(yīng)不同客戶端同時(shí)發(fā)起的請(qǐng)求;
日志:記錄訪問日至,方便做一些分析。
目前在UNIX和LINUX平臺(tái)下使用最廣泛的免費(fèi) Web 服務(wù)器有Apache和 Nginx 。
Web 應(yīng)用程序Web 服務(wù)器接受 Http Request,返回 Response,很多時(shí)候 Response 并不是靜態(tài)文件,因此需要有一個(gè)應(yīng)用程序根據(jù) Request 生成相應(yīng)的 Response。這里的應(yīng)用程序主要用來處理相關(guān)業(yè)務(wù)邏輯,讀取或者更新數(shù)據(jù)庫,根據(jù)不同 Request 返回相應(yīng)的 Response。注意這里并不是 Web 服務(wù)器本身來做這件事,它只負(fù)責(zé) Http 協(xié)議層面和一些諸如并發(fā)處理,安全,日志等相關(guān)的事情。
應(yīng)用程序可以用各種語言編寫(Java, PHP, Python, Ruby等),這個(gè)應(yīng)用程序會(huì)從Web服務(wù)器接收客戶端的請(qǐng)求,處理完成后,再返回響應(yīng)給Web服務(wù)器,最后由Web服務(wù)器返回給客戶端。整個(gè)架構(gòu)如下:
以 Python 為例,使用Python開發(fā)Web,最原始和直接的辦法是使用CGI標(biāo)準(zhǔn),在1998年這種方式很流行。首先確保 Web 服務(wù)器支持CGI及已經(jīng)配置了CGI的處理程序,然后設(shè)置好CGI目錄,在目錄里面添加相應(yīng)的 python 文件,每一個(gè) python 文件處理相應(yīng)輸入,生成一個(gè) html 文件即可,如下例:
#!/usr/bin/python # -*- coding: UTF-8 -*- print "Content-type:text/html" print # 空行,告訴服務(wù)器結(jié)束頭部 print "" print "" print "" print "" print "" print "Hello Word! 我是一個(gè)CGI程序
" print "" print ""
這樣在瀏覽器訪問該文件就可以得到一個(gè)簡(jiǎn)單的 Hello World 網(wǎng)頁內(nèi)容。直接通過 CGI 寫 Web 應(yīng)用程序看起來很簡(jiǎn)單,每一個(gè)文件處理輸入,生成html。但是實(shí)際開發(fā)中,可能會(huì)遇到許多不方便的地方。比如:
每個(gè)獨(dú)立的CGI腳本可能會(huì)重復(fù)寫數(shù)據(jù)庫連接,關(guān)閉的代碼;
后端開發(fā)者會(huì)看到一堆 Content-Type 等和自己無關(guān)的 html 頁面元素;
Web 框架早期開發(fā)站點(diǎn)確做了許多重復(fù)性勞動(dòng),后來為了減少重復(fù),避免寫出龐雜,混亂的代碼,人們將 Web 開發(fā)的關(guān)鍵性過程提取出來,開發(fā)出了各種 Web 框架。有了框架,就可以專注于編寫清晰、易維護(hù)的代碼,無需關(guān)心數(shù)據(jù)庫連接之類的重復(fù)性工作。
其中一種比較經(jīng)典的Web框架采用了 MVC 架構(gòu),如下圖所示:
用戶輸入 URL,客戶端發(fā)送請(qǐng)求,控制器(Controller)首先會(huì)拿到請(qǐng)求,然后用模型(Models)從數(shù)據(jù)庫取出所有需要的數(shù)據(jù),進(jìn)行必要的處理,將處理后的結(jié)果發(fā)送給 視圖(View),視圖利用獲取到的數(shù)據(jù),進(jìn)行渲染生成 Html Response返回給客戶端。
以 python web 框架 flask 為例,框架本身并不限定我們用哪種架構(gòu)來組織我們的應(yīng)用,不過 flask 可以很好地支持以 MVC 方式組織應(yīng)用。
控制器:flask 可以用裝飾器來添加路由項(xiàng),如下:
@app.route("/") def main_page(): pass
模型:主要用來取出需要的數(shù)據(jù),如下面函數(shù)中操作:
@app.route("/") def main_page(): """Searches the database for entries, then displays them.""" db = get_db() cur = db.execute("select * from entries order by id desc") entries = cur.fetchall() return render_template("index.html", entries=entries)
視圖:flask 利用 jinja2 來渲染頁面,下面的模版文件指定了頁面的樣式:
{% for entry in entries %}
我們知道Python有著許多的 Web 框架,而同時(shí)又有著許多的 Web 服務(wù)器(Apache, Nginx, Gunicorn等),框架和Web服務(wù)器之間需要進(jìn)行通信,如果在設(shè)計(jì)時(shí)它們之間不可以相互匹配的,那么選擇了一個(gè)框架就會(huì)限制對(duì) Web 服務(wù)器的選擇,這顯然是不合理的。
那么,怎樣確??梢栽诓恍薷腤eb服務(wù)器代碼或網(wǎng)絡(luò)框架代碼的前提下,使用自己選擇的服務(wù)器,并且匹配多個(gè)不同的網(wǎng)絡(luò)框架呢?答案是接口,設(shè)計(jì)一套雙方都遵守的接口就可以了。對(duì)python來說,就是WSGI(Web Server Gateway Interface,Web服務(wù)器網(wǎng)關(guān)接口)。其他編程語言也擁有類似的接口:例如Java的Servlet API和Ruby的Rack。
Python WSGI的出現(xiàn),讓開發(fā)者可以將 Web 框架與 Web 服務(wù)器的選擇分隔開來,不再相互限制。現(xiàn)在,你可以真正地將不同的 Web 服務(wù)器與Web框架進(jìn)行混合搭配,選擇滿足自己需求的組合。例如,可以使用 Gunicorn 或Nginx/uWSGI來運(yùn)行Django、Flask或web.py應(yīng)用。
下一篇我們將會(huì)仔細(xì)分析 WSGI 接口標(biāo)準(zhǔn),然后一起來寫一個(gè)簡(jiǎn)單的 WSGI Web 服務(wù)器。
更多閱讀本文由 selfboot 發(fā)表于 個(gè)人博客,采用署名-非商業(yè)性使用-相同方式共享 3.0 中國大陸許可協(xié)議。
非商業(yè)轉(zhuǎn)載請(qǐng)注明作者及出處。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者本人。
本文標(biāo)題為: 從零開始搭建論壇(一):Web服務(wù)器與Web框架
本文鏈接為: http://selfboot.cn/2016/07/28...
自己動(dòng)手開發(fā)網(wǎng)絡(luò)服務(wù)器(一)
自己動(dòng)手開發(fā)網(wǎng)絡(luò)服務(wù)器(二)
自己動(dòng)手開發(fā)網(wǎng)絡(luò)服務(wù)器(三)
Web服務(wù)器網(wǎng)關(guān)接口實(shí)現(xiàn)原理分析
Python最佳實(shí)踐指南:Web 應(yīng)用
淺談Python web框架
Python CGI編程
Django vs Flask vs Pyramid: Choosing a Python Web Framework
PEP 333 -- Python Web Server Gateway Interface v1.0
WSGI簡(jiǎn)介
Model-View-Controller (MVC) Explained -- With Legos
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/38092.html
摘要:我們的論壇項(xiàng)目就使用了該框架。此外,麥子學(xué)院也有一個(gè)入門視頻教程,一共小時(shí)的視頻教程,涵蓋開發(fā)的方方面面,包括環(huán)境的搭建,語法介紹,項(xiàng)目結(jié)構(gòu)的組織,全球化,單元測(cè)試等內(nèi)容。博客地址更多閱讀的機(jī)制三個(gè)框架的對(duì)比 前面兩篇文章中我們已經(jīng)了解 Web(HTTP)服務(wù)器,Web應(yīng)用程序,Web框架,WSGI這些 Python Web 開發(fā)中的概念。我們知道,Web框架通過將不同Web應(yīng)用程序中...
摘要:在從零開始搭建論壇一服務(wù)器與框架中我們弄清楚了服務(wù)器應(yīng)用程序框架的概念??蚣軕?yīng)用生成狀態(tài)碼以及響應(yīng)報(bào)頭,然后將二者傳遞至,等待服務(wù)器保存。添加響應(yīng)頭,狀態(tài)碼返回響應(yīng)信息創(chuàng)建一個(gè)服務(wù)器實(shí)例目前支持的成熟服務(wù)器有很多,是相當(dāng)不錯(cuò)的一個(gè)。 在 從零開始搭建論壇(一):Web服務(wù)器與Web框架 中我們弄清楚了Web 服務(wù)器、Web 應(yīng)用程序、Web框架的概念。對(duì)于 Python 來說,越來越多...
摘要:盡量按照前端后端部署運(yùn)維來講,當(dāng)然中途涉及到跨域這種前后協(xié)調(diào)的還是無法避免捎帶一筆。關(guān)于我目前在寫從零構(gòu)建前后分離項(xiàng)目系列,修正和補(bǔ)充以此為準(zhǔn)不斷更新的項(xiàng)目實(shí)踐地址彩蛋提前預(yù)覽下一章傳送門 序: 開源的意義 本系列提前首發(fā)地址 背景 從事了近4年的互聯(lián)網(wǎng)行業(yè),逐漸擔(dān)當(dāng)過團(tuán)隊(duì)的前端到后端的負(fù)責(zé)人,和大家一樣從小白逐漸的成長(zhǎng)起來,回首望去幾年前的博客還是那么稚嫩。 回首這幾年: 從一個(gè)ja...
摘要:從前端到后端到運(yùn)維,經(jīng)歷了幾次前后端架構(gòu)的演變,踩了無數(shù)的坑,度過無數(shù)難免的夜。為了工作或?qū)W習(xí),確實(shí)造過一些輪子,前端的后端的,也開源出來過覺得能提高生產(chǎn)力的。 showImg(https://segmentfault.com/img/bVbgeXP?w=713&h=275); 序: 開源的意義 本系列提前首發(fā)地址 背景 從事了近4年的互聯(lián)網(wǎng)行業(yè),逐漸擔(dān)當(dāng)過團(tuán)隊(duì)的前端到后端的負(fù)責(zé)人,和...
摘要:可以使用或來安裝我用來重新嘗試一次對(duì)速度表示不理想的可以嘗試淘寶的不要過度依賴中可以寫成放哪都行,可以寫成可以寫成看到這個(gè)畫面,安裝完成了。 初步搭建腳手架 Tips 任何不錯(cuò)的開源項(xiàng)目都有 project-cli 腳手架、我們用它生成往往能快速配制出最佳的、理想的腳手架 我通常使用 cli 生成項(xiàng)目骨架再在之基礎(chǔ)上進(jìn)行個(gè)人修改。 什么是 CLI 命令行界面(英語:command-li...
閱讀 2137·2021-11-22 15:24
閱讀 2433·2021-09-09 11:53
閱讀 3049·2021-09-04 16:40
閱讀 1647·2019-08-30 15:52
閱讀 3367·2019-08-29 13:47
閱讀 2749·2019-08-26 17:40
閱讀 1560·2019-08-26 13:24
閱讀 2256·2019-08-26 12:01