Web服務器層
Web服務器主要是接收 HTTP 請求並返回響應。常見的 web服務器有 Nginx,Apache,IIS等。在上圖1的三層結構中,web服務器是最先接收用戶請求的,並將響應結果最終返回給用戶。
WSGI層
WSGI 是一種規範/協議,其全稱爲 the Python Web Server Gateway Interface,定義了 web服務器和 web應用之間的接口規範。
下面的代碼展示了 web服務器是如何與 web應用組合在一起的
def application(env, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return [b"Hello World"]
上述代碼就是一個完整的 WSGI 應用,當一個支持 WSGI 的 web服務器接收到客戶端的請求後,便會調用這個 application 方法。WSGI 層並不需要關心 env, start_response 這兩個變量是如何實現的。
值得指出的是,WSGI 是一種協議,需要區分幾個相近的名詞:
uwsgi:是uWSGI服務器的獨佔通信協議,用於定義傳輸信息的類型。其與WSGI協議是兩種東西,據說該協議是fcgi協議的10倍快。
uWSGI:uWSGI是一個Web服務器,它實現了WSGI協議、uwsgi、http等協議。
Web框架層
Web框架的作用主要是方便我們開發 web應用程序,HTTP請求的動態數據就是由 web框架層來提供的。常見的 web框架有Flask,Django等。
我們以 Flask 框架爲例子,展示 web框架的作用:
from flask import Flask
app = Flask(__name__)
@app.route('/hello')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run(port=5000)
以上簡單的幾行代碼,就創建了一個 web應用程序對象 app。 app 監聽機器所有 ip 的 8080 端口,接受用戶的請求連接。
對於 web框架的使用者來說,只需要關心如何實現業務的邏輯即可,他們並不關心如何接收 HTTP 請求,也不關心如何將請求路由到具體方法處理並將響應結果返回給用戶。
Nginx,uWSGI,Flask 之間的對話
Nginx:Hey,uWSGI,我剛收到了一個請求,我需要你作些準備,然後由Flask來處理這個請求。
uWSGI:OK,Nginx。我會設置好環境變量,然後將這個請求傳遞給Flask處理。
Flask:Thanks uWSGI!給我一些時間,我將會把請求的響應返回給你。
uWSGI:Flask,那我等你。
Flask:Okay,我完成了,這裏是請求的響應結果,請求把結果傳遞給Nginx。
uWSGI:Good job!Nginx,這裏是響應結果,已經按照要求給你傳遞回來了。
Nginx:Cool,我收到了,我把響應結果返回給客戶端。
更多
獲取更多內容請關注微信公衆號豆志昂揚:
- 直接添加公衆號豆志昂揚;
- 微信掃描下圖二維碼;