天天看點

用 Flask 來寫個輕部落格 (18) — 使用工廠模式來生成應用對象目錄前文清單工廠模式使用工廠方法 Factory Method 建立 app 對象

<a href="#%E7%9B%AE%E5%BD%95">目錄</a>

<a href="#%E5%89%8D%E6%96%87%E5%88%97%E8%A1%A8">前文清單</a>

<a href="#%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F">工廠模式</a>

<a href="#%E4%BD%BF%E7%94%A8%E5%B7%A5%E5%8E%82%E6%96%B9%E6%B3%95-factory-method-%E5%88%9B%E5%BB%BA-app-%E5%AF%B9%E8%B1%A1">使用工廠方法 Factory Method 建立 app 對象</a>

<a href="http://blog.csdn.net/jmilk/article/details/53150084">用 Flask 來寫個輕部落格 (1) — 建立項目</a>

<a href="http://blog.csdn.net/jmilk/article/details/53152158">用 Flask 來寫個輕部落格 (2) — Hello World!</a>

<a href="http://blog.csdn.net/jmilk/article/details/53153382">用 Flask 來寫個輕部落格 (3) — (M)VC_連接配接 MySQL 和 SQLAlchemy</a>

<a href="http://blog.csdn.net/jmilk/article/details/53184903">用 Flask 來寫個輕部落格 (4) — (M)VC_建立資料模型和表</a>

<a href="http://blog.csdn.net/jmilk/article/details/53187575">用 Flask 來寫個輕部落格 (5) — (M)VC_SQLAlchemy 的 CRUD 詳解</a>

<a href="http://blog.csdn.net/jmilk/article/details/53229180">用 Flask 來寫個輕部落格 (6) — (M)VC_models 的關系(one to many)</a>

<a href="http://blog.csdn.net/jmilk/article/details/53239740">用 Flask 來寫個輕部落格 (7) — (M)VC_models 的關系(many to many)</a>

<a href="http://blog.csdn.net/jmilk/article/details/53241361">用 Flask 來寫個輕部落格 (8) — (M)VC_Alembic 管理資料庫結構的更新和降級</a>

<a href="http://blog.csdn.net/jmilk/article/details/53264049">用 Flask 來寫個輕部落格 (9) — M(V)C_Jinja 文法基礎快速概覽</a>

<a href="http://blog.csdn.net/jmilk/article/details/53292248">用 Flask 來寫個輕部落格 (10) — M(V)C_Jinja 常用過濾器與 Flask 特殊變量及方法</a>

<a href="http://blog.csdn.net/jmilk/article/details/53303870">用 Flask 來寫個輕部落格 (11) — M(V)C_建立視圖函數</a>

<a href="http://blog.csdn.net/jmilk/article/details/53306560">用 Flask 來寫個輕部落格 (12) — M(V)C_編寫和繼承 Jinja 模闆</a>

<a href="http://blog.csdn.net/jmilk/article/details/53321939">用 Flask 來寫個輕部落格 (13) — M(V)C_WTForms 服務端表單檢驗</a>

<a href="http://blog.csdn.net/jmilk/article/details/53327164">用 Flask 來寫個輕部落格 (14) — M(V)C_實作項目首頁的模闆</a>

<a href="http://blog.csdn.net/jmilk/article/details/53332204">用 Flask 來寫個輕部落格 (15) — M(V)C_實作博文頁面評論表單</a>

<a href="http://blog.csdn.net/jmilk/article/details/53342517">用 Flask 來寫個輕部落格 (16) — MV(C)_Flask Blueprint 藍圖</a>

<a href="http://blog.csdn.net/jmilk/article/details/53352359">用 Flask 來寫個輕部落格 (17) — MV(C)_應用藍圖來重構項目</a>

工廠模式:就是通過某一個接口函數或對象來建立另一個對象,而這個接口函數也稱之為工廠函數。 工廠模式使一個類的執行個體化延遲到其子類。也就是說工廠模式可以推遲到在程式運作的時候才動态決定要建立哪個類的執行個體,而不是在編譯時就必須知道要執行個體化哪個類。

工廠函數:一個用于建立對象的接口(create_object_interface(variables)),讓子類來決定(根據不同 variables 作為條件來判斷)執行個體化那一個類的對象。

EXAMPLE:

這樣做的好處:

可以利用 shell 環境(env)的上下文來動态的改變 app 的初始配置 config,達到了伺服器會根據不同的 env 來得到正确 app config 的效果。

這樣會讓測試變得簡單,因為我們随時可以快速的轉換 app config 并開展測試。

反之,也能夠使用相同的 config 來生成多個相同的 app object,這對在跨多個伺服器進行流量負載均衡的時候是很有用的。

jmilkfansblog/__init__.py

NOTE 1:将 <code>app.config.from_object(object_name)</code> 接收的參數定義成一個變量,這樣就可以通過接收不同類型的實參來生成不同的 app 對象。

NOTE 2:在 create_app() 這個函數中,完成了 db/config/route/blueprint 的初始化工作之後,再傳回這個 app 對象。

manage.py

NOTE 1:現在的 manager shell 在每次啟動的時候,都會擷取一次 OS 的環境變量,并以此來建立 app 對象。

NOTE 2:預設使用 DevConfig 配置

NOTE 3:這樣我們就可以根據手動設定的環境變量來達到生成相應的環境變量的效果,而不需要修改任何源碼。

EXAMPLE 1:使用預設配置

EXAMPLE 2:手動設定使用 Config 配置

使用工廠函數生成的 app 對象,能夠在程式運作的時候才被決定,這種自動适應不同運作環境的能力,使得程式更加靈活、健壯。