文章目錄
ㄧ. 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 相關文件:
- Application Setup — Flask Documentation (1.1.x)
- Extensions — Flask Documentation (1.1.x)
- Flask Factory Pattern to set up your project. – ITNEXT
更多 Flask 教學相關閱讀:
▍關於 Flask 教學系列目錄:
▍關於 Flask 部署相關文章:
- 【Flask 教學系列】實作 GCP 部署 Flask + Nginx + uWSGI
- 【Flask 教學系列】實作 Flask + GitHub Action CI/CD
- 第一集:實作 Dockerfile + flask 教學 (附GitHub完整程式)
- 第二集:實作 Dockerfile + nginx + ssl + flask 教學 (附GitHub完整程式)
- 第三集:實作 Docker-compose (Flask+Nginx+PostgreSQL)
▍其他 Flask 相關教學:
- 【Flask教學系列】Flask 為甚麼需要 WSGI 與 Nginx
- 【Flask教學系列】Flask-SQLAlchemy 資料庫連線&設定入門 (一)
- 【Flask教學系列】Flask-JWT-Extended 實作
- 【Flask教學系列】實作 Flask CORS
- 【Flask教學系列】實作 Flask CSRF Protection
有關 Max行銷誌的最新文章,都會發佈在 Max 的 Facebook 粉絲專頁,如果想看最新更新,還請您按讚或是追蹤唷!