04 Python Flask 教學10 所有文章

【Flask 教學】實作 Flask Application Factories 工廠模式

flask application factory 工廠模式_Max行銷誌

ㄧ. Flask 為什麼要使用工廠模式?

當需要切換測試環境,或是有許多不同版本配置的 Flask Application 時,官方推薦使用 Application Factories。Application Factories — Flask Documentation (1.1.x)

1. 什麼是 工廠模式 設計模型

關於工廠模式 – 維基百科 的補充:

建立物件可能會導致大量的重複代碼,可能會需要複合物件存取不到的資訊,也可能提供不了足夠級別的抽象,還可能並不是複合物件概念的一部分。工廠方法模式通過定義一個單獨的建立物件的方法來解決這些問題。

簡單來說就是利用工廠模式的設計,當傳入不同參數時,會取得不同的實例。

2. 舉個 Flask 工廠模式的例子

當使用工廠模式後 main.py 會改成如下:

from app import create_app, db

app = create_app('development')

我們如果要轉成測試環境的話,只需要將 development 改成 testing 就可以囉!

from app import create_app, db

app = create_app('testing')

而且當 Flask 建置 Application 工廠模式後,除了環境配置容易切換外,在進行單元測試 Unittest 時也很方便。

二. 如何建立 Flask Application Factories

1. 環境建置

本次的程式碼放置於 GitHub: flask-template/template-flask-factory-Application/flask at master · hsuanchi/flask-template · GitHub

此次需安裝的 requirements 套件

click==7.1.2
Flask==1.1.2
Flask-SQLAlchemy==2.4.4
itsdangerous==1.1.0
Jinja2==2.11.2
MarkupSafe==1.1.1
SQLAlchemy==1.3.18
Werkzeug==1.0.1

此次的資料夾結構

/flask
├── /app
│   ├── __init__.py
│   └── config
│       └── config.py
└── main.py

2. Flask 工廠模式建置

▍位置:flask/main.py

from app import create_app

app = create_app('development')

▍位置:flask/app/init.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from .config.config import config

db = SQLAlchemy()

def create_app(config_name):

    app = Flask(__name__)
    app.config.from_object(config[config_name])

    db.init_app(app)

    @app.route('/')
    def index():
        return 'welcome'

    return app

可以看到 create_app 裡面首先會根據 main.py 傳來的 create_app('development') development 參數,進行載入 config 配置檔,然後 init_app(套件)、最後才是載入 Flask route 路徑。

▍位置:flask/app/config/config.py

import os
import datetime

basedir = os.path.abspath(os.path.dirname(__file__))


def create_sqlite_uri(db_name):
    return "sqlite:///" + os.path.join(basedir, db_name)


class BaseConfig:  # 基本配置
    SECRET_KEY = 'THIS IS MAX'
    PERMANENT_SESSION_LIFETIME = datetime.timedelta(days=14)

class DevelopmentConfig(BaseConfig):
    DEBUG = False
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://username:[email protected]:3306/tablename'

class TestingConfig(BaseConfig):
    TESTING = True
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_DATABASE_URI = create_sqlite_uri("test.db")

config = {
    'development': DevelopmentConfig,
    'testing': TestingConfig,
}

都設置完成後,最後運行 Flask,並連線到 http://127.0.0.1:5000,如果有看到 welcome 就代表成功囉!

Windows 運行 Flask

> set FLASK_APP=main.py
> flask run

Mac 運行 Flask

> export FLASK_APP=main.py
> flask run

本篇參考 Flask Application 相關文件:

更多 Flask 教學相關閱讀:

▍關於 Flask 教學系列目錄:

▍關於 Flask 部署相關文章:

▍其他 Flask 相關教學:

有關 Max行銷誌的最新文章,都會發佈在 Max 的 Facebook 粉絲專頁,如果想看最新更新,還請您按讚或是追蹤唷!

發佈留言

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