隨著flask程序越來越復(fù)雜,我們需要對程序進行模塊化的處理,之前學(xué)習(xí)過python的模塊化管理,于是針對一個簡單的flask程序進行模塊化處理
創(chuàng)新互聯(lián)建站是專業(yè)的泗水網(wǎng)站建設(shè)公司,泗水接單;提供網(wǎng)站建設(shè)、網(wǎng)站制作,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行泗水網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
舉例來說:
我們有一個博客程序,前臺界面需要的路由為:首頁,列表,詳情等頁面
源程序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()
如果博主需要編輯博客,要進入后臺進行處理:后臺主頁,編輯,創(chuàng)建,發(fā)布博客
改進后程序: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文件中寫入了很多路由,將來維護代碼會非常麻煩,此時,同學(xué)們就考慮到了模塊化的處理方式,將admin相關(guān)的路由寫到一個admin.py文件中,那我們就順著這個思路走下去
修改后的代碼: # app.pyfrom 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'
發(fā)現(xiàn)app.py文件中的app直接報錯,代碼無法繼續(xù)寫下去,所以在flask程序中,使用傳統(tǒng)的模塊化是行不通的,需要flask提供一個特有的模塊化處理方式,flask內(nèi)置了一個模塊化處理的類,即Blueprint
簡單來說,Blueprint 是一個存儲操作方法的容器,這些操作在這個Blueprint 被注冊到一個應(yīng)用之后就可以被調(diào)用,F(xiàn)lask 可以通過Blueprint來組織URL以及處理請求。
Flask使用Blueprint讓應(yīng)用實現(xiàn)模塊化,在Flask中,Blueprint具有如下屬性:
一個應(yīng)用可以具有多個Blueprint
可以將一個Blueprint注冊到任何一個未使用的URL下比如 “/”、“/sample”或者子域名
在一個應(yīng)用中,一個模塊可以注冊多次
Blueprint可以單獨具有自己的模板、靜態(tài)文件或者其它的通用操作方法,它并不是必須要實現(xiàn)應(yīng)用的視圖和函數(shù)的
在一個應(yīng)用初始化時,就應(yīng)該要注冊需要使用的Blueprint
但是一個Blueprint并不是一個完整的應(yīng)用,它不能獨立于應(yīng)用運行,而必須要注冊到某一個應(yīng)用中。
藍圖/Blueprint對象用起來和一個應(yīng)用/Flask對象差不多,最大的區(qū)別在于一個 藍圖對象沒有辦法獨立運行,必須將它注冊到一個應(yīng)用對象上才能生效
使用藍圖可以分為三個步驟
1,創(chuàng)建一個藍圖對象
admin=Blueprint('admin',__name__)
2,在這個藍圖對象上進行操作,注冊路由,指定靜態(tài)文件夾,注冊模版過濾器
@admin.route('/') def admin_home(): return 'admin_home'
3,在應(yīng)用對象上注冊這個藍圖對象
app.register_blueprint(admin,url\_prefix='/admin')
當(dāng)這個應(yīng)用啟動后,通過/admin/可以訪問到藍圖中定義的視圖函數(shù)
當(dāng)我們在應(yīng)用對象上注冊一個藍圖時,可以指定一個url_prefix關(guān)鍵字參數(shù)(這個參數(shù)默認是/)
在應(yīng)用最終的路由表 url_map中,在藍圖上注冊的路由URL自動被加上了這個前綴,這個可以保證在多個藍圖中使用相同的URL規(guī)則而不會最終引起沖突,只要在注冊藍圖時將不同的藍圖掛接到不同的自路徑即可
url_for
url_for('admin.index') # /admin/