Flask初探之WSGI


Flask是一個使用 Python 編寫的輕量級 Web 應用框架。較其他同類型框架更爲靈活、輕便、安全且容易上手。它可以很好地結合MVC模式進行開發,小型團隊在短時間內就可以完成功能豐富的中小型網站。另外,Flask還有很強的定製性,用戶可以根據自己的需求來添加相應的功能,在保持核心功能的同時實現豐富的功能擴展。Flask強大的插件庫也可以讓用戶實現個性化的網站定製,開發出功能強大的網站。

Flask 的三個特點:輕量級靈活定製型強。接下來將用5篇來介紹Flask原理,難度由淺入深。

flask demo

首先以最快的的方法跑一個最簡單的Flask程序。
app.py

import time
from flask import Flask 

# 實例化一個Flask類,app代表着flask程序。
app = Flask(__name__)

# 向flask實例添加一個路由
@app.route('/')
def hello_world():
    return 'Hello World!'

運行flask

flask run

訪問127.0.0.1:5000

從flask中導入Flask類,然後實例化Flask類得到一個應用程序:app。
在實例化Flask時,傳入了一個參數__name__,該參數代表文件名,本例中就是app。傳入參數主要爲了定位文件,可以通過傳入這個名字確定程序的根目錄,以便獲得靜態文件和模板文件的目錄。

微框架

在官方介紹中, Flask被稱爲微框架,那麼這裏的是什麼意思呢?

這裏的並不意味着 Flask 功能簡陋,而是指其保留核心且易於擴展。有許多 Web程序不需要後臺管理、用戶認證、權限管理,有些甚至不需要表單或數據庫,所以 Flask 並沒有內置這類功能,而是把這些功能都交給擴展或用戶自己實現。

正因爲如此,從只需要渲染模板的小項目到需要各種功能的大項目,Flask 幾乎能夠適應各種情況。 Flask的這一設計理念正印證了《Zen of Python 》裏的這一句Simple is better than complex

WSGI

Flask作爲一個web框架,WSGI是必須要實現的組件。那麼什麼是WSGI?在web框架中的作用又是什麼?
web框架分爲兩個部分,分別是:

  1. 服務端程序:接收客戶端發送的請求
  2. 應用程序:處理客戶端的請求

WSGI:Web Server Gateway Interface 網站服務網關接口,一種網絡請求的規範,服務端程序就是實現了WSGI規範的程序。Flask是處理客戶端請求的應用程序。
兩者的關係如下:

爲什麼需要服務端程序?難道不可以直接將請求發送給應用端嗎?
因爲在處理請求時不希望接觸到TCP連接、HTTP原始請求、請求定位等底層數據處理,所以需要一個統一的接口幫助我們來處理這些的數據,讓我們專心用Python編寫Web業務。這個接口就是WSGI:Web Server Gateway Interface。WSGI定義了一種規範,將請求原始數據處理好,以固定的格式傳遞給應用程序。凡是實現了WSGI規範的程序都可以稱之爲服務器程序。

應用程序如何工作?
當一個請求過來之後服務端程序將請求解析,並根據請求的內容調用處理函數,這裏處理函數就是應用程序。應用程序接收到參數,處理並返回結果。

從請求數據格式的角度來看
HTTP請求到我們的Web程序之間,有一個轉換過程——從Http報文到WSGI 規定的數據格式。實現了WSGI的程序則可以視爲客戶端請求和我們的Web程序之間溝通的橋樑。
數據格式的轉化如下:

WSGI工作細節

python自帶的一個簡單的wsgi服務,通過該服務來探究WSGI的工作細節。
wsgi_simple.py

# 從wsgiref模塊導入:
from wsgiref.simple_server import make_server

def application(environ, start_response):
    start_response('200 ok', [('Content-Type', 'text/html')])
    return [b'<h1>hello wsgi!</h1>']

# 創建一個服務器,IP地址爲空,端口是8080,處理函數是application:
httpd = make_server('', 8080, application)
print ("Serving HTTP on port 8080...")

# 開始監聽HTTP請求:
httpd.serve_forever()

訪問127.0.0.1:8080

根據WSGI的規定,應用程序必須是一個可調用對象(call able object)。
WSGI務器啓動後會監聽本機的對應端口。當接收到請求時,將請求報文解析爲一個 environ字典, 同時提供一個設置服務器狀態和各種返回頭標誌的函數start_response,將environstart_response作爲參數,調用應用端程序真正處理請求。
參數:可調用對象接收兩個參數

  1. environ 包含了請求的所有信息的字典
  2. start_response 通知服務器響應狀態並設置各種標頭

返回:可迭代對象

在上例中application就是應用程序,它是一個函數,也可以是方法或類。接受的參數是wsgiref服務端程序提供的environstart_response,返回值是一個字節串,可迭代對象。

總結一下web框架兩個組件的功能:
服務端程序:

  1. 監聽本機端口
  2. 將請求解析成字典
  3. 調用應用程序,將結果返回給請求方

應用程序:

  1. 接受environstart_response兩個參數
  2. 設置返回狀態和返回頭部信息
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章