Flask 項目結構
在此紀錄我的Flask服務器學習歷程,希望在越來越熟練以後,能帶給新進的學習者一盞指路明燈,也希望各路大神可以給予指點。
這篇拖了很久,因為config的部分在不同部署情況下,可能有各種變化,最後我覺得先寫一些最基本的介紹就好,未來有寫到使用Docker之類的工具部署,再來補充說明。
使用Flask從官方複製下來的程式碼,基本上5分鐘就可以本地端的server跑起來,隨著服務的內容越來越多,項目的結構也必須做好管理,這邊分享我配置項目結構的方法,這是上網查了資料以後,融合成我自己的版本,尤其我使用的不是Flask-SQLAlchemy(原因),而是原生的版本,在資料庫的配置上可能稍微不一樣。
requirements.txt
python管理套件檔案,不必多說了。.env
這個檔案可以用來設定執行的環境變數,配合dotenv這個套件,下面app.py有範例說明。
config.py
這邊使用與官方文檔類似的config文件,可以將Flask服務器需要用的配置設定在這邊,未來加入各種擴充套件,也可以在此設定套件需要的配置,並且,依照不同的開發、測試、生產等環境,配置不同參數。
/instance
在這個資料夾裡,放置不想讓別人知道的配置內容,例如Secret key等等,並且設定不要上傳GitHub之類的(請參考git文檔)。/instance/config.py
因此,將不想公開的配置,也以config.py檔案,放置在/instance中,再啟動Flask時,使用app.config.from_pyfile('config.py')
導入,下面app.py有範例解說。
/resources
放置管理RestFul Api 路徑的文件夾,會在未來Flask-RestFul的文章中介紹。/template
template資料夾是當使用render_tempplate('file.html')
函數回傳html時,Flask尋找.html的位置,檔案路徑不需要加上/template,請參考app.py中範例。/static
放置靜態文件.css、.js、圖片等。
Flask預設從static這個文件夾抓取靜態文件(static file),也就是說,當使用者從瀏覽器發送request給Flask,Flask回傳的html中所import的.css、.js、.jpg等檔案,必須要放在此資料夾才讀取得到,且路徑需要加上/static/file.css,如果要修改預設的static文件夾,可以使用app = Flask(__name__, static_folder='templates')
,請參考app.py中範例。
model.py
利用SQLAlchemy建立的資料庫對應關係,詳情請看上一篇,這邊為了將路徑放入config當中,做了一點修改,使用from app import app_config
獲得配置內的資料路連線IP。
app.py
重點終於來了,Flask服務器啟動檔案!
dotenv
這個套件可以在執行時,使用load_dotenv()
載入.env
檔案內的環境變數,請參考文檔,因此使用os.environ.get(‘ENV’)
可以取得.env
檔案內的ENV
參數。
使用config.py載入配置,有幾種不同的方法,請參考文檔,另外這篇寫得很棒,這邊我使用物件的方式導入,config[env]
回傳config.py
裡面,字典config
中key
為development
的物件。
大家應該有發現,在創建Flask的時候,增加了一個參數instance_relative_config=True
,文檔,設定為True時,使用app.config.from_pyfile('config.py')
會從/instance
資料夾找到config.py
。
instance_relative_config — if set to True relative filenames for loading the config are assumed to be relative to the instance path instead of the application root.
接下來說明from model import *
目的是為了從model.py
引入db_session
,接著使@app.teardown_appcontext
裝飾,表示在每個request結束以後,關閉SQLAlchemy創建的session
,避免超過Pool可容許的連線數,這部分有點難說明,詳請請參考文檔,與上篇文章。
最後,可以測試一下設定不同的static_folder
,使用預設的/static
,開啟127.0.0.1:5000/bootstrap_demo
,可以正常的顯示,並使用放置在/static
裡的bootstrap.css
套件,然而,開啟127.0.0.1:5000/
,卻無法正常顯示Vue專案的起始頁面,因為所有的檔案都在/template
資料夾,因此,將static_folder
,改為/template
,即可成功開啟,相對的127.0.0.1:5000/bootstrap_demo
,則無法顯示。