在學習一個東西以前,咱們確定想知道:它爲何會出現?那麼,WSGI爲何會出現呢?html
咱們知道,部署一個web應用,常常須要使用nginx、apache或者IIS等web服務器把web應用跑起來,而後用戶在瀏覽器能夠經過URL進行訪問。前端
爲了可以讓各類web服務器都能支持web應用,因此必須在web應用和web服務器之間有一個統一的規範(協議)。python
其實,在PEP 3333中也有提到它的目標:nginx
爲了定義了一個「 Web 服務器和 Python Web 應用程序或框架之間」的標準接口,以便提高 Web 應用程序在不一樣 Web 服務器上的可移植性。git
注意:github
一、這裏的web應用是Python Web應用程序。web
二、這裏的web服務器是指nginx、apache等。apache
三、WSGI爲何會出如今WSGI有更加詳細的說明。瀏覽器
https://github.com/python/peps/blob/master/pep-0333.txt服務器
WSGI,全稱 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是爲 Python 語言定義的 Web 服務器和 Web 應用程序或框架之間的一種簡單而通用的接口。
更精確的說,應該是一種協議或規範:描述web server
如何與web application
通訊的規範。server
和application
的規範在PEP 3333中有具體描述。要實現WSGI協議,必須同時實現web server和web application,當前運行在WSGI
協議之上的web
框架有Bottle
, Flask
, Django
。
它是一個標準,描述了一個web server和web app如何通信,以及webapp怎麼處理前端請求。一個web服務流程相似於這樣:
WSGI的主要做用是在Web服務器(uwsgi)和Web應用程序(application)承擔「翻譯官」的角色。對於這一角色能夠這樣理解:
根據以上分析,要實現符合WSGI標準的Web服務,服務器和應用程序的設計就要符合WSGI規範。
這裏引伸出一個概念:uwsgi
uwsgi定義:與WSGI
同樣,是一種通訊協議,是uWSGI
服務器的獨立協議。是一個web
服務器,實現了WSGI
協議、uwsgi
協議、http
協議等。
用於定義傳輸信息的類型(type of information
),每個uwsgi packet
前4byte
爲傳輸信息類型的描述,與WSGI協議是兩個不一樣的協議,聽說該協議是fcgi
協議的10倍快。
由於WSGI其實就是一個協議,根據官方的定義,大體內容以下:
● WSGI application可以調用python對象(函數或者一個帶有__call__方法的類。__call__方法有2個參數:第一個參數是WSGI的environ,第二個參數是一個start_response函數。
● application必須使用start_response(status,headers),而且返回值是一個可迭的代序列,序列中的每一個對象將標準輸出。
● WSGI environ和CGI environ同樣,都是一些鍵值對,要麼是提供給server,要麼提供給middleware。
● 能夠將包裝後的middleware添加到你的app中。
下面是一個簡單的例子:
def application(env, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return '<h1>Hello, web!</h1>'
做爲web app自己,你就算啓動了程序,你也沒辦法給application傳遞參數。
因此,實際上,調用application和傳遞2個參數的動做,是web 服務器來進行的,好比uwsgi.
而這個叫作application的東西,在Flask框架內部的名字,叫作wsgi_app。
Werkzeug是什麼鬼呢?Werkzeug是一個WSGI工具包,他能夠做爲一個Web框架的底層庫。Flask就用到了這個庫。Flask主要用到了Werkzeug和jinja2兩個庫。
Werkzeug官方文檔說明以下:
werkzeug ~~~~~~~~ Werkzeug is the Swiss Army knife of Python web development. Werkzeug是python web開發的一把瑞士軍刀。 It provides useful classes and functions for any WSGI application to make the life of a python web developer much easier. All of the provided classes are independent from each other so you can mix it with any other library. 它爲WSGI應用提供了有用的類和函數,讓python的web開發工做更容易。Werkeug提供的全部類都是彼此解耦的,因此你可以使用其餘任何庫進行糅雜。 (翻譯不是很是到位,哈哈)
最後以 Nginx(web server),WSGI,Flask(web app) 之間的對話結束本文。
===========================================================
Nginx:Hey,WSGI,我剛從用戶那裏收到了一個請求,如今轉發給你。
WSGI:好的,Nginx,我會設置好環境變量,而後將這個請求傳遞給Flask處理。
Flask:Thanks WSGI!給我一些時間,我將會把請求的響應返回給你。
WSGI:All right,那我等你。
Flask:Okay,我完成了,這裏是請求的響應結果,請求把結果傳遞給Nginx。
WSGI:Good job!Nginx,這裏是響應結果,已經按照要求給你傳遞回來了。
Nginx:Cool,我收到了,我把響應結果返回給客戶端。你們合做愉快~