天天看點

python em和web_Python 搭建Web站點之Web伺服器與Web架構

之前用 Django 做過一個小的站點,感覺Django太過笨重,于是就準備換一個比較輕量級的 Web 架構來玩玩。Web.py 作者已經挂掉,項目好久沒有更新,是以不準備用它。而 Flask 也是一個成熟的輕量級 Web 架構,在 github 上有衆多的 Star 和 Fork,文檔和擴充也很豐富,值得學習。

學習一個架構最好的方式就是用架構做一個項目,在實戰中了解掌握架構。這裡我用 Flask 架構,使用 Mysql 資料庫做了一個 論壇系統 。麻雀雖小,五髒俱全,論壇效果圖如下:

python em和web_Python 搭建Web站點之Web伺服器與Web架構

論壇系統截圖

下面是論壇的基本功能:

完整的使用者子產品(注冊、登入,更改、找回密碼、資訊修改、站内消息通知); 豐富的論壇子產品(建立、回複話題,站内搜尋,markdown支援,@user 提醒); 強大的背景管理,支援屏蔽使用者、話題、評論,支援各種條件搜尋話題、評論;

本部落格将會用一系列文章,記錄論壇系統搭建的過程,希望對剛入門Web開發的同學有所幫助。

我們經常聽說 Django, Flask 這些 python 語言的Web 架構,那麼架構到底是什麼,Web架構和Web伺服器(Nginx, Apache等)有什麼差別?離開架構還能用 Python 搭建Web站點嗎?要解決這些疑問,我們有必要來了解下 Web 伺服器的工作原理,以及 Web 架構的本質。

Web 伺服器

當我們在浏覽器輸入URL後,浏覽器會先請求 DNS伺服器,獲得請求站點的 IP 位址 。然後發送一個HTTP Request(請求)給擁有該 IP 的主機,接着就會接收到伺服器給我們的 HTTP Response(響應),浏覽器經過渲染後,以一種較好的效果呈現給我們。這個過程中,正是Web伺服器在幕後默默做貢獻。

簡單來說,Web伺服器是在運作在實體伺服器上的一個程式,它永久地等待用戶端(主要是浏覽器,比如Chrome,Firefox等)發送請求。當收到請求之後,它會生成相應的響應并将其傳回至用戶端。Web伺服器通過HTTP協定與用戶端通信,是以也被稱為HTTP伺服器。

python em和web_Python 搭建Web站點之Web伺服器與Web架構

Web 伺服器

Web伺服器的工作原理并不複雜,一般可分成如下4個步驟:建立連接配接、請求過程、應答過程以及關閉連接配接。

建立連接配接:客戶機通過TCP/IP協定建立到伺服器的TCP連接配接。 請求過程:用戶端向伺服器發送HTTP協定請求包,請求伺服器裡的資源文檔。 應答過程:伺服器向客戶機發送HTTP協定應答包,如果請求的資源包含有動态語言的内容,那麼伺服器會調用動态語言的解釋引擎負責處理“動态内容”,并将處理得到的資料傳回給用戶端。由用戶端解釋HTML文檔,在用戶端螢幕上渲染圖形結果。 關閉連接配接:客戶機與伺服器斷開。

下面我們實作一個簡單的 Web 伺服器。運作示例程式後,會監聽本地端口 8000,在浏覽器通路 http://www.php.cn/:8000 就能看到響應内容。而我們的程式也能夠列印出用戶端發來的請求内容,如下圖:

python em和web_Python 搭建Web站點之Web伺服器與Web架構

簡單Web伺服器

這裡Request 和 Response 都需要遵守 HTTP 協定,關于 HTTP 協定的詳細内容,可以讀讀《HTTP 權威指南》,或者看我整理的HTTP 部分内容。

雖然說web伺服器的主要工作是根據request傳回response,但是實際中的 Web 伺服器遠遠比上面示例的複雜的多,因為要考慮的因素實在是太多了,比如:

緩存機制:講一些經常被通路的頁面緩存起來,提高響應速度; 安全:防止黑客的各種攻擊,比如 SYN Flood 攻擊; 并發處理:如何響應不同用戶端同時發起的請求; 日志:記錄通路日至,友善做一些分析。

目前在UNIX和LINUX平台下使用最廣泛的免費 Web 伺服器有Apache和 Nginx 。

Web 應用程式

Web 伺服器接受 Http Request,傳回 Response,很多時候 Response 并不是靜态檔案,是以需要有一個應用程式根據 Request 生成相應的 Response。這裡的應用程式主要用來處理相關業務邏輯,讀取或者更新資料庫,根據不同 Request 傳回相應的 Response。注意這裡并不是 Web 伺服器本身來做這件事,它隻負責 Http 協定層面和一些諸如并發處理,安全,日志等相關的事情。

應用程式可以用各種語言編寫(Java, PHP, Python, Ruby等),這個應用程式會從Web伺服器接收用戶端的請求,處理完成後,再傳回響應給Web伺服器,最後由Web伺服器傳回給用戶端。整個架構如下:

python em和web_Python 搭建Web站點之Web伺服器與Web架構

Web應用程式

以 Python 為例,使用Python開發Web,最原始和直接的辦法是使用CGI标準,在1998年這種方式很流行。首先確定 Web 伺服器支援CGI及已經配置了CGI的處理程式,然後設定好CGI目錄,在目錄裡面添加相應的 python 檔案,每一個 python 檔案處理相應輸入,生成一個 html 檔案即可,如下例:

# !/usr/bin/python

# -*- coding: UTF-8 -*-

print "Content-type:text/html"

print # 空行,告訴伺服器結束頭部

print ''

print '

'

print ''

print ''

print '

'

print '

Hello Word! 我是一個CGI程式

'

print ''

print ''

這樣在浏覽器通路該檔案就可以得到一個簡單的 Hello World 網頁内容。直接通過 CGI 寫 Web 應用程式看起來很簡單,每一個檔案處理輸入,生成html。但是實際開發中,可能會遇到許多不友善的地方。比如:

每個獨立的CGI腳本可能會重複寫資料庫連接配接,關閉的代碼; 後端開發者會看到一堆 Content-Type 等和自己無關的 html 頁面元素; Web 架構

早期開發站點确做了許多重複性勞動,後來為了減少重複,避免寫出龐雜,混亂的代碼,人們将 Web 開發的關鍵性過程提取出來,開發出了各種 Web 架構。有了架構,就可以專注于編寫清晰、易維護的代碼,無需關心資料庫連接配接之類的重複性工作。

其中一種比較經典的Web架構采用了 MVC 架構,如下圖所示:

python em和web_Python 搭建Web站點之Web伺服器與Web架構

MVC 架構

使用者輸入 URL,用戶端發送請求,控制器(Controller)首先會拿到請求,然後用模型(Models)從資料庫取出所有需要的資料,進行必要的處理,将處理後的結果發送給 視圖(View),視圖利用擷取到的資料,進行渲染生成 Html Response傳回給用戶端。

以 python web 架構 flask 為例,架構本身并不限定我們用哪種架構來組織我們的應用,不過 flask 可以很好地支援以 MVC 方式組織應用。

控制器:flask 可以用裝飾器來添加路由項,如下:

@app.route('/')

def main_page():

pass

模型:主要用來取出需要的資料,如下面函數中操作:

@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 %}

{{ entry.title }}

{{ entry.text|safe }}

{% else %}

No entries yet. Add some!

{% endfor %}

我們知道Python有着許多的 Web 架構,而同時又有着許多的 Web 伺服器(Apache, Nginx, Gunicorn等),架構和Web伺服器之間需要進行通信,如果在設計時它們之間不可以互相比對的,那麼選擇了一個架構就會限制對 Web 伺服器的選擇,這顯然是不合理的。

那麼,怎樣確定可以在不修改Web伺服器代碼或網絡架構代碼的前提下,使用自己選擇的伺服器,并且比對多個不同的網絡架構呢?答案是接口,設計一套雙方都遵守的接口就可以了。對python來說,就是WSGI(Web Server Gateway Interface,Web伺服器網關接口)。其他程式設計語言也擁有類似的接口:例如Java的Servlet API和Ruby的Rack。

Python WSGI的出現,讓開發者可以将 Web 架構與 Web 伺服器的選擇分隔開來,不再互相限制。現在,你可以真正地将不同的 Web 伺服器與Web架構進行混合搭配,選擇滿足自己需求的組合。例如,可以使用 Gunicorn 或Nginx/uWSGI來運作Django、Flask或web.py應用。

python em和web_Python 搭建Web站點之Web伺服器與Web架構

更多Python 搭建Web站點之Web伺服器與Web架構相關文章請關注PHP中文網!

python em和web_Python 搭建Web站點之Web伺服器與Web架構

本文原創釋出php中文網,轉載請注明出處,感謝您的尊重!