第十屆鐵人賽 flask-restful DAY12-搞懂flask

甚麼是flask

甚麼是flask呢?維基百科這樣解釋:

Flask是一個使用Python編寫的輕量級Web應用框架。基於Werkzeug WSGI工具箱和Jinja2模板引擎。

這部分先跳過Jinja2模板引擎的說明,因為本篇主要內容放在restful的部分,待之後筆者有機會在跟大家專門說明flask時在介紹。接下來先說明Werkzeug跟WSGI是甚麼。

Werkzeug跟WSGI是甚麼

WSGI是Web Server Gateway Interface的縮寫,是為Python語言定義的Web伺服器和Web應用程式或框架之間的一種簡單而通用的埠,而Werkzeug是實現WSGI規範的一個函式庫,再來flask是基於Werkzeug下開發的一個framework,而WSGI的內容又說了些甚麼呢,細節部分需要請讀者參考WSGI的維基百科,不過這部分筆者要先說明根據維基百科的說明WSGI相關內容如下:

WSGI區分為兩個部份:一為「伺服器」或「閘道」,另一為「應用程式」或「應用框架」。在處理一個WSGI請求時,伺服器會為應用程式提供環境資訊及一個回呼函式(Callback Function)。當應用程式完成處理請求後,透過前述的回呼函式,將結果回傳給伺服器。

正因為flask符合這協定,所以我們可以定義middelware在不改變flask內容的狀況下來完成某些功能。

重要功能

介紹完甚麼是flask後相信大家經過第一天的文章就知道要如何使用,flask的使用方式如下列式子所列:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

會使用flask後這裡在更進一步要介紹flask內有甚麼功能。

config

這部分介紹flask的config要如何設定,基本上有幾種方法,較常用的分成以下幾種設定方式:

  • 像操作字典一樣的設定
  • 像設定物件屬性一樣設定
  • 透過字典的update方法來設定

首先像操作字典dict一樣的設定方式如下:

app.config['TESTING'] = True

再來設定物件屬性的方式來設定

app.testing = True

最後是透過字典dictupdate方法一次設定資料的內容。

app.config.update(
    TESTING=True,
    SECRET_KEY=b'_5#y2L"F4Q8z\n\xec]/'
)

在說明完設定的方式後再來如果有需要知道flask有哪些資料可以設定,以及設定後有甚麼公用請看flask官網的設定章節

Logging

相信大家在在產品上線後都會需要log來追蹤是否有bug,或者是否有出乎意料的狀況,此時相信透過print是沒辦法解決的,所以這裡介紹flask內建的log功能logger,而使用方式如下:

app.logger.debug('A value for debugging')
app.logger.warning('A warning occurred (%d apples)', 42)
app.logger.error('An error occurred')

其中app就是flask實體,而logger有甚麼更進一步的用法呢,請各位讀者參考flask官方網站的logger篇

使用WSGI的middleware

在客製化middleware之前先教大家如何使用middleware,使用的方法如下:

app.wsgi_app = printMiddleware(app.wsgi_app)

其中app即是flask的實體,而將wsgi_app包裝起來就可以在呼叫flask前後先透過middleware處理。

客製化WSGI的middleware

在知道如何使用middleware之後要進一步告訴大家如何自定義一個middleware,請各位讀者看一下下面例子:

class printMiddleware(object):
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        print('— — — — — — — — — —')
        print('Function called')
        print('— — — — — — — — — —')
        return self.app(environ, start_response)

相信各位還記得前面說到WSGI的規範,environ包含了客户端請求的信息以及其他信息start_response就是要響應返還的接口,透過以上範例可以在每次request時在server的console印出下列內容了。

— — — — — — — — — —
Function called
— — — — — — — — — —

小結

今天終於開始進入flask的內容了,雖然說了很多觀念的東西,但是還是希望讀者們今天能有所收穫,接下來的日子開始要介紹restful以及flask-restful,敬請期待。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *