大型 flask 項目目錄結構

很多人覺得 flask 不適合做大型項目,其實這是不對的,flask 不僅做小眾網站強悍,

做大型網站也毫不遜色。一個好的目錄結構,對整個項目的影響是深遠的,尤其是對

維護開發人員,更是閱讀友好,方便查閱修改的。

注:這裡說的適不適合做大型項目,完全只是從目錄結構考慮的,不考慮插件等,

不接受槓精反駁

給大家看一下我的目錄結構:

大型 flask 項目目錄結構

給大家簡單聊一下各個模塊的作用

myblog(項目名)下有 app, logs, migrations, venv 四個文件夾或模塊

  • app 下面是按照功能模塊進行劃分的,比如article是和文章相關的功能,
  • auth 是登錄認證相關功能,comment是相關評論功能等
  • logs 是項目的日誌文件
  • migrations 是數據庫遷移相關
  • venv 項目的虛擬環境
  • manager.py 是項目的入口,目前用作開發調試,
  • 後期會維護一個wsgi.py 方便用gunicorn近期啟動管理

對於目錄結構可能還有更好的設計,我們把目錄功能拆的那麼細,那麼項目

是如何串起來的呢。這個才是關鍵。

藍圖

把各個功能模塊串起來,其實藍圖功不可沒,首先在功能模塊中創建一個藍圖

大型 flask 項目目錄結構

然後把這個藍圖對象articles_bp 在app上進行註冊

大型 flask 項目目錄結構

這時候有人會問,如果有多個模塊的話,擴展起來每次都要修改application.py裡的

configure_blueprint函數,這樣有點麻煩,有沒有簡單一點的辦法呢,答案當然是有的了

自己寫一個實現自動註冊的功能就好了。可以通過 importlib.import_module來進行

動態導入模塊,我們的藍圖對象知道一個規則,命名統一以XXX開頭或結尾,然後通過

分析該模塊是是否有藍圖對象,來實現自動註冊功能。這裡就不贅述了。

通過以上的操作 ,我們就把各個功能模塊串聯在一起了。

日誌

日誌配置也很重要,一個好的日誌,對定位問題有巨大的幫助。

我這裡用的日誌策略是按天劃分,一天一個日誌, 默認保存一個月以內的日誌,

下面給大家看一下代碼。


大型 flask 項目目錄結構


數據庫遷移

我們總希望部署能夠簡單,所幸,我們找到了數據庫遷移工具包flask_migrate, 使用也很簡單。

flask db init # 初始化工具,並生成一個migrations文件夾

flask db migrate # 生成遷移文件,也就是migrations下面的version文件夾裡的文件

這些文件都是具體執行的動作指令,比如創建表啊類似等

大型 flask 項目目錄結構


flask db upgrade # 執行數據庫操作動作,實際上就是執行上圖中upgrade()函數,

來操作數據庫, 比如上圖有個create_table 你就能明白,這是一個創建表的動作。

執行完成之後,可以檢查數據庫是否有這個表生成。

然而實際上我們經常和flask_script一起使用,比如:

大型 flask 項目目錄結構

使用命令方式相應改為上圖註釋中所示那樣。

數據遷移的坑

最初連接數據庫是用mysql+pymysql 這種方式,但是這樣會有一個warning

心裡不爽,經過一番搜索,找到一個答案,改成了 mysql+mysqlconnector這種

方式,果然不報warning,心裡美滋滋。

然後再做數據遷移的時候,我發現第一次遷移生成的遷移文件還算正常,

什麼創建表之類的,但是當我更改數據庫模型,準備升級數據庫的時候,

我發現,這種連接方式有個嚴重的問題,導致我通過

flask db migrate生成的遷移文件,每次都是創建表,

而在運行flask db upgrade 總是報錯,表已存在。

折騰了好久,最後實在找不到答案的情況下,福至心靈的改了下連接方式,果然

就正常了,雖然還是由警告,但是也比詭異的出錯強。

說的有點雜,但是都是一把辛酸淚啊。

寫到這裡,基本的目錄架子也算有了,剩下的就是我們繼續優化我們的功能代碼,

功能目錄,但願在需求變更的時候,我們能更有效率。


分享到:


相關文章: