藍圖(Blueprint)詳解


轉載自:https://www.cnblogs.com/wf-skylark/p/9306789.html

以下對藍圖的講解由淺入深,易懂。

Blueprint

模塊化

隨着flask程序越來越復雜,我們需要對程序進行模塊化的處理,針對一個簡單的flask程序進行模塊化處理

舉例來說:

我們有一個博客程序,前台界面需要的路由為:首頁,列表,詳情等頁面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
源程序app.py文件:
from  flask  import  Flask
 
app = Flask(__name__)
 
@app .route( '/' )
def  index():
     return  'index'
 
@app .route( '/list' )
def  list ():
     return  'list'
 
@app .route( '/detail' )
def  detail():
     return  'detail'
 
if  __name__ = = '__main__' :
     app.run()

如果博主需要編輯博客,要進入后台進行處理:后台主頁,編輯,創建,發布博客

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
改進后程序:
from  flask  import  Flask
 
app = Flask(__name__)
 
@app .route( '/' )
def  index():
     return  'index'
 
@app .route( '/list' )
def  list ():
     return  'list'
 
@app .route( '/detail' )
def  detail():
     return  'detail'
 
@app .route( '/' )
def  admin_home():
     return  'admin_home'
 
@app .route( '/new' )
def  new():
     return  'new'
 
@app .route( '/edit' )
def  edit():
     return  'edit'
 
@app .route( '/publish' )
def  publish():
     return  'publish'
 
if  __name__ = = '__main__' :
     app.run()

這樣就使得我們在一個py文件中寫入了很多路由,將來維護代碼會非常麻煩,此時,同學們就考慮到了模塊化的處理方式,將admin相關的路由寫到一個admin.py文件中,那我們就順着這個思路走下去

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
修改后的代碼:
app.py
from  flask  import  Flask
 
app = Flask(__name__)
 
@app .route( '/' )
def  index():
     return  'index'
 
@app .route( '/list' )
def  list ():
     return  'list'
 
@app .route( '/detail' )
def  detail():
     return  'detail'
 
if  __name__ = = '__main__' :
     app.run()
 
admin.py
 
@app .route( '/' )
def  admin_home():
     return  'admin_home'
 
@app .route( '/new' )
def  new():
     return  'new'
 
@app .route( '/edit' )
def  edit():
     return  'edit'
 
@app .route( '/publish' )
def  publish():
     return  'publish'

發現app.py文件中的app直接報錯,代碼無法繼續寫下去,所以在flask程序中,使用傳統的模塊化是行不通的,需要flask提供一個特有的模塊化處理方式,flask內置了一個模塊化處理的類,即Blueprint

Blueprint概念

簡單來說,Blueprint 是一個存儲操作方法的容器,這些操作在這個Blueprint 被注冊到一個應用之后就可以被調用,Flask 可以通過Blueprint來組織URL以及處理請求。

Flask使用Blueprint讓應用實現模塊化,在Flask中,Blueprint具有如下屬性:

  • 一個應用可以具有多個Blueprint
  • 可以將一個Blueprint注冊到任何一個未使用的URL下比如 “/”、“/sample”或者子域名
  • 在一個應用中,一個模塊可以注冊多次
  • Blueprint可以單獨具有自己的模板、靜態文件或者其它的通用操作方法,它並不是必須要實現應用的視圖和函數的
  • 在一個應用初始化時,就應該要注冊需要使用的Blueprint

但是一個Blueprint並不是一個完整的應用,它不能獨立於應用運行,而必須要注冊到某一個應用中。

初識藍圖

藍圖/Blueprint對象用起來和一個應用/Flask對象差不多,最大的區別在於一個 藍圖對象沒有辦法獨立運行,必須將它注冊到一個應用對象上才能生效

使用藍圖可以分為三個步驟

1,創建一個藍圖對象

1
admin = Blueprint( 'admin' ,__name__) 

2,在這個藍圖對象上進行操作,注冊路由,指定靜態文件夾,注冊模版過濾器

1
2
3
@admin .route( '/' )
def  admin_home():
     return  'admin_home'

3,在應用對象上注冊這個藍圖對象

1
app.register_blueprint(admin,url\_prefix = '/admin' )

當這個應用啟動后,通過/admin/可以訪問到藍圖中定義的視圖函數

運行機制

  • 藍圖是保存了一組將來可以在應用對象上執行的操作,注冊路由就是一種操作
  • 當在應用對象上調用 route 裝飾器注冊路由時,這個操作將修改對象的url_map路由表
  • 然而,藍圖對象根本沒有路由表,當我們在藍圖對象上調用route裝飾器注冊路由時,它只是在內部的一個延遲操作記錄列表defered_functions中添加了一個項
  • 當執行應用對象的 register_blueprint() 方法時,應用對象將從藍圖對象的 defered_functions 列表中取出每一項,並以自身作為參數執行該匿名函數,即調用應用對象的 add_url_rule() 方法,這將真正的修改應用對象的路由表

藍圖的url前綴

  • 當我們在應用對象上注冊一個藍圖時,可以指定一個url_prefix關鍵字參數(這個參數默認是/)
  • 在應用最終的路由表 url_map中,在藍圖上注冊的路由URL自動被加上了這個前綴,這個可以保證在多個藍圖中使用相同的URL規則而不會最終引起沖突,只要在注冊藍圖時將不同的藍圖掛接到不同的自路徑即可

  • url_for

url_for('admin.index') # /admin/

注冊靜態路由

  和應用對象不同,藍圖對象創建時不會默認注冊靜態目錄的路由。需要我們在 創建時指定 static_folder 參數。

下面的示例將藍圖所在目錄下的static_admin目錄設置為靜態目錄

1
2
admin  =  Blueprint( "admin" ,__name__,static_folder = 'static_admin' )
app.register_blueprint(admin,url_prefix = '/admin' )

  現在就可以使用/admin/static_admin/ 訪問static_admin目錄下的靜態文件了 定制靜態目錄URL規則 :可以在創建藍圖對象時使用 static_url_path 來改變靜態目錄的路由。下面的示例將為 static_admin 文件夾的路由設置為 /lib

1
2
admin  =  Blueprint( "admin" ,__name__,static_folder = 'static_admin' ,static_url_path = '/lib' )
app.register_blueprint(admin,url_prefix = '/admin' )

設置模版目錄

  藍圖對象默認的模板目錄為系統的模版目錄,可以在創建藍圖對象時使用 template_folder 關鍵字參數設置模板目錄

1
admin  =  Blueprint( 'admin' ,__name__,template_folder = 'my_templates' )

  注:如果在 templates 中存在和 my_templates 同名文件,則系統會優先使用 templates 中的文件 參考鏈接:https://stackoverflow.com/questions/7974771/flask-blueprint-template-folder

 


免責聲明!

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



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