大型應用程式作為套件

想像一下一個簡單的 Flask 應用程式結構,看起來像這樣

/yourapplication
    yourapplication.py
    /static
        style.css
    /templates
        layout.html
        index.html
        login.html
        ...

雖然這對於小型應用程式來說還可以,但對於較大型的應用程式來說,最好使用套件而不是模組。《教學》的結構設計為使用套件模式,請參閱範例程式碼

簡單套件

要將其轉換為更大的套件,只需在現有的資料夾內建立一個新的資料夾 yourapplication,並將其下的所有內容移動進去。然後將 yourapplication.py 重新命名為 __init__.py。(請務必先刪除所有 .pyc 檔案,否則很可能會出錯)

然後您應該會得到類似這樣的結果

/yourapplication
    /yourapplication
        __init__.py
        /static
            style.css
        /templates
            layout.html
            index.html
            login.html
            ...

但是現在您要如何執行您的應用程式呢?天真的 python yourapplication/__init__.py 將無法運作。我們就說 Python 不希望套件中的模組成為啟動檔案。但這不是一個大問題,只需在內部的 yourapplication 資料夾旁邊新增一個名為 pyproject.toml 的檔案,內容如下

[project]
name = "yourapplication"
dependencies = [
    "flask",
]

[build-system]
requires = ["flit_core<4"]
build-backend = "flit_core.buildapi"

安裝您的應用程式,使其可匯入

$ pip install -e .

要使用 flask 命令並執行您的應用程式,您需要設定 --app 選項,告訴 Flask 在哪裡找到應用程式實例

$ flask --app yourapplication run

我們從中獲得了什麼?現在我們可以將應用程式稍微重組為多個模組。您唯一要記住的是以下快速檢查清單

  1. Flask 應用程式物件的建立必須在 __init__.py 檔案中。這樣一來,每個模組都可以安全地匯入它,並且 __name__ 變數將解析為正確的套件。

  2. 所有視圖函式(頂部帶有 route() 裝飾器的那些)都必須在 __init__.py 檔案中匯入。不是物件本身,而是它所在的模組。在建立應用程式物件之後匯入視圖模組。

以下是一個 __init__.py 的範例

from flask import Flask
app = Flask(__name__)

import yourapplication.views

這就是 views.py 的樣子

from yourapplication import app

@app.route('/')
def index():
    return 'Hello World!'

然後您應該會得到類似這樣的結果

/yourapplication
    pyproject.toml
    /yourapplication
        __init__.py
        views.py
        /static
            style.css
        /templates
            layout.html
            index.html
            login.html
            ...

循環匯入

每個 Python 程式設計師都討厭它們,然而我們剛剛新增了一些:循環匯入(也就是當兩個模組彼此依賴時。在本例中,views.py 依賴於 __init__.py)。請注意,這通常是一個壞主意,但在這裡實際上是沒問題的。原因是因為我們實際上並沒有在 __init__.py 中使用視圖,而只是確保模組被匯入,而且我們是在檔案的底部這樣做的。

使用藍圖

如果您有較大型的應用程式,建議將其劃分為較小的群組,其中每個群組都藉助藍圖來實作。有關此主題的入門介紹,請參閱文件中的《使用藍圖的模組化應用程式》章節。