Flask 項目結構

Liwei Cheng
5 min readMay 25, 2020

--

在此紀錄我的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裡面,字典configkeydevelopment的物件。

大家應該有發現,在創建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,則無法顯示。

Github: https://github.com/liweicheng00/Flask-Demo-v0.1

--

--

Liwei Cheng
Liwei Cheng

Written by Liwei Cheng

Find all fascinating things on the world. 不愛說話,但想當說故事的人。

No responses yet