Flask學習-Flask基礎之WSGI

1、WSGI爲何會出現?

在學習一個東西以前,咱們確定想知道:它爲何會出現?那麼,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服務器

2、什麼是WSGI?

WSGI,全稱 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是爲 Python 語言定義的 Web 服務器和 Web 應用程序或框架之間的一種簡單而通用的接口。

更精確的說,應該是一種協議或規範:描述web server如何與web application通訊的規範。serverapplication的規範在PEP 3333中有具體描述。要實現WSGI協議,必須同時實現web server和web application,當前運行在WSGI協議之上的web框架有BottleFlaskDjango

它是一個標準,描述了一個web server和web app如何通信,以及webapp怎麼處理前端請求。一個web服務流程相似於這樣:

 

 

WSGI的主要做用是在Web服務器(uwsgi)和Web應用程序(application)承擔「翻譯官」的角色。對於這一角色能夠這樣理解:

 

  1. Web服務器的責任在於監聽和接收請求。在處理請求的時候調用WSGI提供的標準化接口,將請求的信息轉給WSGI
  2. WSGI的責任在於「中轉」請求和響應信息。WSGI接收到Web服務器提供的請求信息後能夠作一些處理,以後經過標準化接口調用Web應用,並將請求信息傳遞給Web應用。同時,WSGI還將會處理Web應用返回的響應信息,並經過服務器返回給客戶端;
  3. Web應用的責任在於接收請求信息,而且生成響應。

 

根據以上分析,要實現符合WSGI標準的Web服務,服務器和應用程序的設計就要符合WSGI規範。

這裏引伸出一個概念:uwsgi

uwsgi定義:WSGI同樣,是一種通訊協議,是uWSGI服務器的獨立協議。是一個web服務器,實現了WSGI協議、uwsgi協議、http協議等。

用於定義傳輸信息的類型(type of information),每個uwsgi packet4byte爲傳輸信息類型的描述,與WSGI協議是兩個不一樣的協議,聽說該協議是fcgi協議的10倍快。

3、WSGI實現

由於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。

 

4、Werkzeug

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提供的全部類都是彼此解耦的,因此你可以使用其餘任何庫進行糅雜。
(翻譯不是很是到位,哈哈)

  

 

5、結束語

最後以 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,我收到了,我把響應結果返回給客戶端。你們合做愉快~

相關文章
相關標籤/搜索