學習藍圖之前先說一下什麼是模組化?
隨著flask程式越來越複雜,我們需要對程式進行模組化的處理,之前學習過python的模組化管理,於是針對一個簡單的flask程式進行模組化處理
舉例來說:
我們有一個部落格程式,前臺介面需要的路由為:首頁,列表,詳情等頁面
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()複製程式碼
如果需要編輯部落格,要進入後臺進行處理:後臺主頁,編輯,建立,釋出部落格
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檔案中,那我們就順著這個思路走下去。
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 被註冊到一個應用之後就可以被呼叫,Flask 可以通過Blueprint來組織URL以及處理請求。
Flask使用Blueprint讓應用實現模組化,在Flask中,Blueprint具有如下屬性:
- 一個應用可以具有多個Blueprint
- 可以將一個Blueprint註冊到任何一個未使用的URL下比如 “/”、“/sample”或者子域名
- 在一個應用中,一個模組可以註冊多次
- Blueprint可以單獨具有自己的模板、靜態檔案或者其它的通用操作方法,它並不是必須要實現應用的檢視和函式的
- 在一個應用初始化時,就應該要註冊需要使用的Blueprint
但是一個Blueprint並不是一個完整的應用,它不能獨立於應用執行,而必須要註冊到某一個應用中。
使用藍圖可以分為三個步驟:
1.建立一個藍圖物件
admin = Blueprint('admin',__name__)複製程式碼
2.註冊路由,指定靜態資料夾,註冊模板過濾器
@admin.route('/')
def admin_home():
retuen 'admin_home'
複製程式碼
3.在應用物件上註冊這個物件
app.register_blueprint(admin,url_prefix='/admin') #當我們在應用物件上註冊一個藍圖時,可以指定一個url_prefix關鍵字引數(這個引數預設是/)複製程式碼
當這個應用啟動後,通過/admin/可以訪問到藍圖中定義的檢視函式
執行機制
- 藍圖是儲存了一組將來可以在應用物件上執行的操作,註冊路由就是一種操作
- 當在應用物件上呼叫 route 裝飾器註冊路由時,這個操作將修改物件的url_map路由表
- 然而,藍圖物件根本沒有路由表,當我們在藍圖物件上呼叫route裝飾器註冊路由時,它只是在內部的一個延遲操作記錄列表defered_functions中新增了一個項
- 當執行應用物件的 register_blueprint() 方法時,應用物件將從藍圖物件的 defered_functions 列表中取出每一項,並以自身作為引數執行該匿名函式,即呼叫應用物件的 add_url_rule() 方法,這將真正的修改應用物件的路由表
註冊靜態路由
和應用物件不同,藍圖物件建立時不會預設註冊靜態目錄的路由。需要我們在建立時指定static_folder 引數。
下面的示例將藍圖所在目錄下的static_admin目錄設定為靜態目錄
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
admin = Blueprint("admin",__name__,static_folder='static_admin',static_url_path='/lib')
app.register_blueprint(admin,url_prefix='/admin')複製程式碼
設定模版目錄
藍圖物件預設的模板目錄為系統的模版目錄,可以在建立藍圖物件時使用 template_folder 關鍵字引數設定模板目錄
admin = Blueprint('admin',__name__,template_folder='my_templates')複製程式碼