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框架分為兩個部分,分別是:
- 服務端程式:接收客戶端傳送的請求
- 應用程式:處理客戶端的請求
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
,將environ
和start_response
作為引數,呼叫應用端程式真正處理請求。
引數:可呼叫物件接收兩個引數
- environ 包含了請求的所有資訊的字典
- start_response 通知伺服器響應狀態並設定各種標頭
返回:可迭代物件
在上例中application
就是應用程式,它是一個函式,也可以是方法或類。接受的引數是wsgiref服務端程式提供的environ
和start_response
,返回值是一個位元組串,可迭代物件。
總結一下web框架兩個元件的功能:
服務端程式:
- 監聽本機埠
- 將請求解析成字典
- 呼叫應用程式,將結果返回給請求方
應用程式:
- 接受
environ
和start_response
兩個引數 - 設定返回狀態和返回頭部資訊