Flask 藍圖(Blueprint)使用方式解析


Flask藍圖提供了模塊化管理程序路由的功能,使程序結構清晰、簡單易懂。下面分析藍圖的使用方法

假如說我們要為某所學校的每個人建立一份檔案,一個很自然的優化方式就是這些檔案如果能分類管理,就是說假如分為老師、學生、后勤人員等類別,那么后續查找和管理這些檔案就方便清晰許多。Flask的藍圖就提供了類似“分類”的功能。

下面先上一張較大型程序的組織結構圖

 

 
1

可以看到在app文件夾下有兩個文件夾main和auth內含有視圖函數,而main和auth就是注冊的兩個藍圖。

1. 藍圖的創建及注冊

在圖1中,以main文件夾為例。在main文件夾的__init__.py文件中,可創建藍圖,代碼如下:

 

 
2

從Flask中導入Blueprint類,再創建一個實例即可。Blueprint接受兩個參數實例化,分別為藍本的名字和藍本所在的包或模塊,大多數情況下第二個參數使用Python 的__name__ 變量即可。

 

 
3

在圖3中,是在Flask文件夾下的__init__.py文件中注冊這兩個模塊(請結合圖1理解文件夾的組織結構)。該__init__.py文件中包含app創建函數,創建app后,即可注冊已創立的藍圖。

最后一部是在main文件夾下的view文件中導入創建的藍圖,使用from . import main命令。不要忘記這一步,應為視圖函數實在view文件種定義的,不導入藍圖的話,無法用藍圖定義路由。

另請注意在圖2中,在main = Blueprint('main', __name__) 命令下有一個from . import views, errors命令。該命令的意思是導入在views和errors整個模塊。在此我們發現views模塊和__init__模塊之間存在相互導入。一定要保證__init__模塊中,from . import views, error命令在main = Blueprint('main', __name__)之后,否則會產生依賴循環導入的錯誤。

2. 使用藍圖創建路由

使用藍圖創建路由的示例如下圖:

 

 
4

該路由的創建有兩點要注意,一是@main.route修飾器,在使用藍圖之前,所有的路由均通過@app.route注冊,在此可對比創建藍圖后的不同。二是url_for函數的參數,該參數是一個“端點”名稱,就是和在路由中定義的視圖函數的名稱,此處的‘ .index ’端點名是一種簡寫的方式,就是表示main藍圖下的index函數。如果我們要指向‘auth’藍圖下的index函數,應該使用‘ auth.index ’ 端點名稱

另請注意圖4中生成的url和通過@app.route修飾器生成的url沒有區別,是因為在注冊main藍圖時(見圖2)沒有加“前綴”。回到圖2,對比main藍圖和auth藍圖的注冊,會發現auth在注冊時多了一個url_prefix='/auth' ,這個就是加的前綴。假如我們通過@auth.route('/student')創建了一個路由,那么我們在訪問該路由時,要輸入www.somehost.com/auth/student 才能行。

3. 從藍圖回到全局

創建藍本后,會對Flask已定義的一些功能造成改變。例如在Flask中提供了一個before_request 鈎子,通過該鈎子,可以注冊在請求之前必須先完成的函數。在創建藍本前,當訪問通過@app.route修飾器創建的所有路由時,均要先完成在鈎子中注冊的函數。但注冊藍本后,如果使用@main.before_request鈎子,那么我們訪問通過別的藍本注冊的路由時,可不用先完成在鈎子中注冊的函數。如果仍要保持“全局”的功能,應該使用@main.before_app_request鈎子。


鏈接:https://www.jianshu.com/p/95b584e4f76e


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM