Flask 微框架核心簡潔且易於擴充套件,讓開發者能彈性選擇組態。本文詳細說明佈署與維護、微服務架構、GPT 整合等關鍵技術,提供豐富的實務範例與佈署策略。同時也涵蓋了容器化佈署、無伺服器佈署、AI 應用開發等進階主題,適合想深入學習 Flask 開發的工程師。本文的範例程式碼可在 GitHub 上取得,方便讀者實際操作與練習。此外,本文也提供額外的技巧與建議,幫助開發者提升應用程式的價值。

序言與導讀指引

本文《Flask Framework Cookbook》第三版涵蓋了多項 Flask 開發中的實務技術與佈署策略,從應用程式的開發到佈署後的監控與維護,均提供了深入淺出的指導與實用範例。以下為本文的主要章節與重點整理:

章節概覽

  • 第11章:佈署與佈署後管理
    本章節重點介紹多種應用程式佈署方式及相關工具,並探討如何進行應用程式監控,以持續追蹤效能表現。成功的佈署與佈署後的維護對於應用程式的穩定運作至關重要。

  • 第12章:微服務與容器技術
    本章節詳細闡述如何使用 Docker 將 Flask 應用程式容器化,並透過 Kubernetes 進行佈署。此外,還介紹瞭如何利用 Google Cloud Run 和 GitHub Actions 實作無伺服器(serverless)佈署。微服務架構是現代軟體開發中的重要趨勢,能夠大幅提升開發效率與佈署彈性。

  • 第13章:GPT 與 Flask 的整合應用
    本章節展示瞭如何結合 GPT 的強大 API 功能,開發具備 AI 能力的 Flask 應用程式。內容涵蓋自動化文字補全功能的實作、根據 ChatGPT 的簡單聊天機器人開發,以及 AI 驅動的影像生成技術。

  • 第14章:額外技巧與建議
    本章節提供多項可提升應用程式價值的實用技巧與方法。

環境需求與軟體版本

  • 本文範例根據 Python 3.11.xFlask 2.2.x,並在 macOS 與 Ubuntu 等 UNIX-like 系統上進行測試。部分內容可能不適用於舊版 Flask 或 Python 環境。
  • 部分章節涉及第三方 SaaS 服務(如 Sentry、New Relic、Datadog、AWS、GCP、GitHub 及 OpenAI),這些服務通常提供免費試用或有限使用的免費版本,但超出限制後可能需要付費。

程式碼取得與資源下載

本文使用慣例

  • 程式碼格式:正文中的程式碼關鍵字、資料表名稱、檔案名稱等均以特定格式標示。例如:
from flask_wtf.file import FileField, FileRequired

class Product(db.Model):
    image_path = db.Column(db.String(255))

    def __init__(self, name, price, category, image_path):
        self.image_path = image_path
  • 命令列輸入/輸出
$ sudo apt update
$ sudo apt install python3-dev
$ sudo apt install apache2 apache2-dev

重點提示與回饋機制

  • 本文包含多項實用提示(Tips)與注意事項,以協助讀者更好地理解內容。

取得免費 PDF 版本

  • 購買本文後,讀者可透過掃描 QR 碼或存取指定連結,憑購買證明取得免費的 PDF 版本。

本文旨在為讀者提供全面的 Flask 開發,並透過豐富的範例與實務建議,幫助開發者掌握從基礎到進階的各項技術,提升專案開發效率與應用效能。

Flask 基礎組態與環境設定

在開發 Flask 網頁應用程式時,瞭解如何組態應用程式以適應不同環境(如開發和生產環境)至關重要。本章將探討多種設定和組態 Flask 的方法。

為何選擇 Flask?

Flask 被稱為微框架(microframework),這並不意味著它功能有限或需要將所有程式碼放在單一檔案中。相反,Flask 的核心設計保持簡潔且具有高度擴充套件性,使開發者能夠靈活地選擇所需的組態,而不受限於特定的資料函式庫、範本引擎或管理介面。

環境設定與基本組態

首先,讓我們瞭解如何設定一個簡單的 Flask 應用程式。建立一個名為 app.py 的檔案,並新增以下程式碼:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello to the World of Flask!'

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

內容解密:

  • from flask import Flask:匯入 Flask 類別。
  • app = Flask(__name__):建立一個 Flask 應用程式例項,__name__ 用於確定應用程式的根目錄。
  • @app.route('/'):定義路由,當存取根 URL (/) 時,呼叫 hello_world 函式。
  • return 'Hello to the World of Flask!':傳回顯示在瀏覽器上的字串。
  • if __name__ == '__main__'::檢查指令碼是否直接執行(非被匯入)。
  • app.run():啟動開發伺服器。

要執行此應用程式,首先需要安裝 Flask,可以透過 pip 或 pip3 完成:

$ pip3 install Flask

然後,執行應用程式:

$ python3 app.py
* Running on http://127.0.0.1:5000 (Press CTRL+C to quit)

在瀏覽器中存取 http://127.0.0.1:5000/,即可看到應用程式執行。

或者,可以使用 flask run 或 Python 的 -m 開關來執行應用程式。首先設定 FLASK_APP 環境變數:

$ export FLASK_APP=app.py
$ flask run
* Running on http://127.0.0.1:5000/

虛擬環境設定

使用 virtualenv 可以建立獨立的 Python 環境,避免不同專案之間的依賴衝突。安裝 virtualenv 後,可以建立新的虛擬環境並啟用它:

$ virtualenv myenv
$ source myenv/bin/activate

在虛擬環境中安裝 Flask 和其他依賴包。

內容解密:

  • $ virtualenv myenv:建立一個名為 myenv 的虛擬環境。
  • $ source myenv/bin/activate:啟用虛擬環境。

組態管理

Flask 提供了多種組態管理方法,包括基本組態、類別組態和例項資料夾組態。正確的組態管理對於開發和佈署至關重要。

Flask 設定管理與虛擬環境建置

在開發 Flask 應用程式時,正確的設定管理與虛擬環境建置是至關重要的。本篇文章將探討如何使用虛擬環境隔離專案依賴,並介紹多種 Flask 設定載入方法。

虛擬環境的建立與管理

使用虛擬環境可以有效隔離不同專案之間的依賴,避免版本衝突。Python 3 內建的 venv 模組使得建立虛擬環境變得簡單。

建立虛擬環境

首先,在專案目錄下建立一個名為 my_flask_env 的虛擬環境:

$ python3 -m venv my_flask_env

啟動虛擬環境並安裝 Flask

進入 my_flask_env 目錄並啟動虛擬環境:

$ source my_flask_env/bin/activate
$ pip3 install flask

這樣就成功在虛擬環境中安裝了 Flask。

虛擬環境的工作原理

當執行 pip3 install flask 時,實際上安裝了多個相關套件,包括:

  • Werkzeug
  • Jinja2
  • click
  • itsdangerous
  • MarkupSafe

這些套件是 Flask 的核心依賴,缺一不可。

相關工具介紹

在 Python 3.3 之前,virtualenv 是建立虛擬環境的主要工具。雖然 venv 功能相對簡潔,但足以滿足大多數需求。如需更進階的功能,可以考慮使用 virtualenvvirtualenvwrapper

Flask 設定管理

Flask 的設定變數儲存在 Flask 物件的 config 屬性中,這是一個類別似字典的物件。

基本設定方式

可以透過直接修改 config 屬性來設定 Flask:

app = Flask(__name__)
app.config['DEBUG'] = True

或者在物件層級設定:

app.debug = True

亦可於執行應用程式時啟用偵錯模式:

app.run(debug=True)

在新版 Flask 中,也可透過環境變數 FLASK_DEBUG=1 來啟用偵錯模式。

多種設定載入方式

隨著應用程式規模擴大,需要更靈活的設定管理方式。Flask 支援多種設定載入方法:

  1. 從 Python 設定檔載入
    app.config.from_pyfile('myconfig.cfg')
    
  2. 從物件載入設定
    app.config.from_object('myapplication.default_settings')
    
  3. 從環境變數指定的檔案載入
    app.config.from_envvar('PATH_TO_CONFIG_FILE')
    

這些方法提供了靈活的設定管理機制,能夠滿足不同專案的需求。

Flask 組態與靜態檔案管理

組態管理

Flask 提供多種組態管理方式,以適應不同的開發和佈署需求。從 Flask 2.0 版本開始,支援從 JSON 或 TOML 等通用組態檔案格式載入組態。

使用組態檔案

app.config.from_file('config.json', load=json.load)
app.config.from_file('config.toml', load=toml.load)

Flask 只會讀取大寫的組態變數,這使得我們可以在組態檔案中定義區域性變數,而不會干擾 Flask 的組態。

最佳實踐

app.py 中定義預設組態,然後透過組態檔案覆寫這些組態。

app = Flask(__name__)
DEBUG = True
TESTING = True
app.config.from_object(__name__)
app.config.from_pyfile('/path/to/config/file')

類別基礎組態

使用類別繼承模式來管理不同佈署模式的組態。

定義組態類別

class BaseConfig(object):
    SECRET_KEY = 'A random secret key'
    DEBUG = True
    TESTING = False
    NEW_CONFIG_VARIABLE = 'my value'

class ProductionConfig(BaseConfig):
    DEBUG = False
    SECRET_KEY = open('/path/to/secret/file').read()

class StagingConfig(BaseConfig):
    DEBUG = True

class DevelopmentConfig(BaseConfig):
    DEBUG = True
    TESTING = True
    SECRET_KEY = 'Another random secret key'

載入組態

app.config.from_object('configuration.DevelopmentConfig')

這種方式使得管理不同佈署環境的組態更加靈活和容易。

靜態檔案組織

Flask 建議將靜態檔案(如 JavaScript、樣式表、影像等)組織在特定的目錄結構中。

推薦的目錄結構

my_app/
    app.py
    config.py
    __init__.py
    static/
        css/
        js/
        images/
            logo.png

在範本中參照靜態檔案

<img src="{{ url_for('static', filename='images/logo.png') }}">

自定義靜態檔案資料夾

app = Flask(__name__, static_folder='/path/to/static/folder')

或者提供 URL 字首:

app = Flask(__name__, static_url_path='/differentstatic', static_folder='/path/to/static/folder')

然後在範本中使用:

<img src="{{ url_for('static', filename='logo.png') }}">

使用案例項資料夾進行佈署特定組態

Flask 提供了例項資料夾來管理佈署特定的檔案,如資料函式庫檔案、會話檔案、快取檔案等。

預設例項資料夾

my_app/
    app.py
    instance/
        config.cfg

自定義例項資料夾路徑

app = Flask(__name__, instance_path='/absolute/path/to/instance/folder')

從例項資料夾載入組態

app = Flask(__name__, instance_relative_config=True)
app.config.from_pyfile('config.cfg', silent=True)

這種方式使得佈署特定的組態與應用程式碼分離,便於管理和維護。

內容解密:

  1. 類別基礎組態的優點:透過類別繼承,可以方便地管理不同佈署環境下的組態變數,使得組態管理更加模組化和可維護。
  2. 靜態檔案的管理:Flask 透過特定的目錄結構和 url_for 函式,使得靜態檔案的管理和使用變得簡單和靈活。
  3. 例項資料夾的作用:例項資料夾提供了一種機制,用於將佈署特定的檔案與應用程式碼分離,從而提高了應用程式的可移植性和可維護性。

這些組態和管理的最佳實踐,有助於開發出結構清晰、易於維護的 Flask 應用程式。

使用藍圖建立模組化網路應用程式

在開發大型 Flask 應用程式時,模組化是保持程式碼組織和可維護性的關鍵。藍圖(Blueprint)是 Flask 提供的一種機制,能夠幫助我們將應用程式分解成更小、更易於管理的部分。在本章節中,我們將透過一個簡單的範例來展示如何使用藍圖來建立模組化的網路應用程式。

為何使用藍圖?

藍圖並不是一個完整的應用程式,但它可以代表應用程式的一部分或是一個可重複使用的元件。它提供了一種方式來組織相關的路由、範本、靜態檔案等,使應用程式的結構更加清晰。

如何使用藍圖?

首先,我們需要定義一個藍圖。在 my_app/hello/views.py 檔案中,我們建立了一個名為 hello 的藍圖:

from flask import Blueprint
from my_app.hello.models import MESSAGES

hello = Blueprint('hello', __name__)

@hello.route('/')
@hello.route('/hello')
def hello_world():
    return MESSAGES['default']

@hello.route('/show/<key>')
def get_message(key):
    return MESSAGES.get(key) or "%s not found!" % key

@hello.route('/add/<key>/<message>')
def add_or_update_message(key, message):
    MESSAGES[key] = message
    return "%s Added/Updated" % key

內容解密:

  1. Blueprint 物件的建立hello = Blueprint('hello', __name__) 建立了一個名為 hello 的藍圖,第一個引數是藍圖的名稱,第二個引數是藍圖所在的模組名稱。
  2. 路由定義:使用 @hello.route() 裝飾器來定義路由,這與直接在應用程式物件上使用 @app.route() 類別似。
  3. MESSAGES 字典的使用:從 my_app.hello.models 匯入 MESSAGES 字典,用於儲存和檢索訊息。

接下來,在 my_app/__init__.py 檔案中,我們將 hello 藍圖註冊到應用程式物件上:

from flask import Flask
from my_app.hello.views import hello

app = Flask(__name__)
app.register_blueprint(hello)

內容解密:

  1. 匯入藍圖:從 my_app.hello.views 匯入 hello 藍圖。
  2. 註冊藍圖:使用 app.register_blueprint(hello)hello 藍圖註冊到應用程式物件 app 上。

執行應用程式

執行應用程式的方式與之前相同,使用 run.py 檔案:

from my_app import app
app.run(debug=True)

這樣,我們的應用程式就能夠以模組化的方式執行,所有的路由都由 hello 藍圖處理。