Table
ㄧ. Flask 為什麼要使用工廠模式?
當需要切換測試環境,或是有許多不同版本配置的 Flask Application 時,官方推薦使用 Application Factories。Application Factories — Flask Documentation (1.1.x)
1. 什麼是 工廠模式 設計模型
關於工廠模式 – 維基百科 的補充:
建立物件可能會導致大量的重複代碼,可能會需要複合物件存取不到的資訊,也可能提供不了足夠級別的抽象,還可能並不是複合物件概念的一部分。工廠方法模式通過定義一個單獨的建立物件的方法來解決這些問題。
簡單來說就是利用工廠模式的設計,當傳入不同參數時,會取得不同的實例。
2. 舉個 Flask 工廠模式的例子
當使用工廠模式後 main.py 會改成如下:
1 2 3 |
from app import create_app, db app = create_app('development') |
我們如果要轉成測試環境的話,只需要將 development 改成 testing 就可以囉!
1 2 3 |
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 套件
1 2 3 4 5 6 7 8 |
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 |
此次的資料夾結構
1 2 3 4 5 6 |
/flask ├── /app │ ├── __init__.py │ └── config │ └── config.py └── main.py |
2. Flask 工廠模式建置
▍位置:flask/main.py
1 2 3 |
from app import create_app app = create_app('development') |
▍位置:flask/app/__init__.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
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:password@ip: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
1 2 |
> set FLASK_APP=main.py > flask run |
Mac 運行 Flask
1 2 |
> 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 粉絲專頁,如果想看最新更新,還請您按讚或是追蹤唷!