天天看點

Flask使用Blueprint進行多子產品應用的編寫

1、blueprint

在使用flask進行一個項目編寫的時候,可能會有許多個子產品,如一個普通的網際網路sass雲辦公應用,會有使用者管理、部門管理、賬号管理等子產品,如果把所有的這些子產品都放在一個views.py檔案之中,那麼最後views.py檔案必然臃腫不堪,并且極難維護,是以flask中便有了blueprint的概念,可以分别定義子產品的視圖、模闆、視圖等等,我們可以使用blueprint進行不同子產品的編寫,不同子產品之間有着不同的靜态檔案、模闆檔案、view檔案,十分友善代碼的維護和管理,下面就是使用blueprint來進行上面使用者管理、部門管理、賬号管理子產品的模拟編寫,隻涉及到api層面上,模闆檔案和靜态檔案就不寫在上面了。

2、分子產品後的結構

在進行分子產品編寫接口之後,以前提供的接口就不能寫在一個views.py檔案之中,具體結構如下所示:

Flask使用Blueprint進行多子產品應用的編寫
Flask使用Blueprint進行多子產品應用的編寫

dept: 這是部門管理子產品,views是相應的接口檔案。

Flask使用Blueprint進行多子產品應用的編寫

user: 這是使用者管理子產品,同上,views是使用者管理的相應接口。

其他的和之前的類似。

3、業務子產品

3.1 dept子產品

在這裡,我們定義了dept blueprint對象,便于在views.py檔案中應用,替代Flask對象。主要的接口 

views.py:

提供兩個接口,一個接口用于查詢特定的部門,一個接口用于傳回部門清單,dept對象我是模拟的部門數組,沒有用models.py檔案中dept對象,主要是在這一節中沒有使用相應的orm架構,是以就沒寫相應的model,這個在随後中會涉及到。

另外一個,我在擷取depts接口時,用的就不是jsonify方法了,而是内置的json.dumps轉換為json對象,我之是以這樣寫,是因為jsonify如果要傳回數組對象的話,必須要相應的對象實作一個方法傳回json資料,或者将這個對象轉成字典類型,然後循環周遊這個對象,比較麻煩,是以這裡我就直接使用json.dumps來進行轉換了。

在相應的路由注解上,我使用的就是dept.route,是以在定義了為dept的blueprint對象後,這裡的作用相當于當初定義的app Flask對象,但其實是進行了view層的路由後,最終還是注冊到了app上面,在代碼層面上實作了不同子產品之間的隔離。

3.2、user子產品

user子產品功能和代碼大部分和dept相同,這裡僅僅隻貼出代碼,不再描述具體的功能。

3.3、run.py檔案

最終Blueprint對象在run檔案之中進行注冊,如下:

其他的我就沒有再講了,config.py和manager.py在這些簡單的應用中還無需用到,講到後面再來說這些的作用。

4、運作

啟動run檔案,進行運作,請求

結果:

第一個接口請求成功:

請求第二個接口:

Flask使用Blueprint進行多子產品應用的編寫

接口同樣請求成功,在這裡dept子產品就不去請求,結果是類似的。

5、總結

Flask使用Blueprint進行多子產品應用的編寫

Blueprint其實本身隻是對view上的接口進行了注冊,然後整體挂載在app上,Blueprint本身的目的就是組織多子產品的平行共存,避免直接在app上注冊view,其實更多的隻是友善開發和代碼的維護,因為最終所有的views上的接口都仍然是直接挂載在app上,其實對應整個應用來說,沒有什麼明顯的差別。

Flask使用Blueprint進行多子產品應用的編寫

Flask 中的Blueprint不是一個可插撥的應用,因為它不是一個真正的應用,而是一套可以注冊 在應用中的操作,并且可以注冊多次。

Flask使用Blueprint進行多子產品應用的編寫

同時在這裡,我們不能使用多個flask對象來管理和注冊,因為這樣會導緻每個flask對象都有一個自己的配置,不好管理。

Flask使用Blueprint進行多子產品應用的編寫

使用Blueprint,應用會在Flask層中進行管理,共享配置,通過注冊按需改變應用 對象。Blueprint的缺點是一旦應用被建立後,隻有銷毀整個應用對象才能登出lueprint。

Flask使用Blueprint進行多子產品應用的編寫

綜合以上,簡單來說,Blueprint就是通過url找到view的一套機制,并沒有太過于複雜的邏輯。

原文釋出時間為:2017-03-30

本文作者:夏軒