1 回答

TA貢獻1995條經驗 獲得超2個贊
Web 服務器層
對于傳統的客戶端 - 服務器架構,客戶端向服務器發送請求,服務器接收請求,處理請求,最后給客戶端返回請求的響應,即簡單來說,一個服務器的作用是:
接收請求
處理請求
返回響應
此文我們探討web服務器,常見的web服務器有Nginx,Apache等。在這個三層結構中,web 服務器是最先接收到用戶的請求的。
Web框架層
常見的web框架有Flask,Django等,我們以Flask框架為例子,展示web框架的作用:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()123456789
以上簡單的幾行代碼,就創建了一個web應用程序對象app。
Web框架為我們提供路由管理,cookies管理等功能,讓我們只需要關心業務的邏輯,提高開發的效率。
WSGI層
WSGI不是服務器,也不是用于與程序交互的API,更新不真實的代碼,而只是一種接口。它只適用于Python語言,其全稱為Web Server Gateway Interface,定義了web服務器和web應用之間的接口規范。也就是說,只要web服務器和web應用都遵守WSGI協議,那么web服務器和web應用就可以隨意的組合。
def application(env, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return [b"Hello World"]123
代碼中的env,start_response變量由web服務器傳入,其中,env是一個字典,包含了類似HTTP_HOST,HOST_USER_AGENT,SERVER_PROTOCO等環境變量。start_response則是方法,接受兩個參數,分別是status,response_headers。application方法設置http響應的狀態碼和Content-Type等頭部信息,并返回響應具體結果。
上述代碼就是一個完整的WSGI應用,當一個支持WSGI的web服務器(例如Nginx)接收到客戶端的請求后,便會調用這個application方法。WSGI層并不需要關心env,start_response這兩個變量是如何實現的,直接使用即可。
值得指出的是,WSGI是一種協議,需要區分幾個相近的名詞:
- uwsgi
同wsgi一樣也是一種協議,uWSGI服務器正是使用了uwsgi協議
- uWSGI
實現了uwsgi和WSGI兩種協議的web服務器。注意uWSGI本質上也是一種web服務器,處于上面描述的三層結構中的web服務器層。
- CGI
通用網關接口,并不限于python語言,定義了web服務器是如何向客戶端提供動態的內容。例如,規定了客戶端如何將參數傳遞給web服務器,web服務器如何將參數傳遞給web應用,web應用如何將它的輸出如何發送給客戶端,等等。
生產環境下的web應用都不使用CGI了,CGI進程(類似Python解釋器)針對每個請求創建,用完就拋棄,效率低下。WSGI正是為了替代CGI而出現的。
說到這,我們基本理清了WSGI在web服務器與web框架之間作用:WSGI就像一條紐帶,將web服務器與web框架連接起來?;氐奖疚牡念}目,Nginx屬于一種web服務器,Flask屬于一種web框架,因此,WSGI與Nginx、Flask的作用就不明而喻了。
最后以Nginx,WSGI,Flask之間的對話結束本文。
Nginx:Hey,WSGI,我剛收到了一個請求,我需要你作些準備,然后由Flask來處理這個請求。
WSGI:OK,Nginx。我會設置好環境變量,然后將這個請求傳遞給Flask處理。
Flask:Thanks WSGI!給我一些時間,我將會把請求的響應返回給你。
WSGI:Alright,那我等你。
Flask:Okay,我完成了,這里是請求的響應結果,請求把結果傳遞給Nginx。
WSGI:Good job!Nginx,這里是響應結果,已經按照要求給你傳遞回來了。
Nginx:Cool,我收到了,我把響應結果返回給客戶端。大家合作愉快~
- 1 回答
- 0 關注
- 1563 瀏覽
添加回答
舉報