1. 程式人生 > >flask使用藍圖,建立副本

flask使用藍圖,建立副本

隨著flask的發展,flask框架越來越複雜,我們需要進行模組化處理,因為之前學過python模組化管理,我可以對一個flask程式進行簡單的模組化處理。

我們都有一個部落格程式,由此可知部落格的前端介面需要的路由:首頁,列表頁,詳情頁等頁面,如果博主需要編輯部落格,必需進入後臺處理後臺主頁,編輯,建立,釋出。

因為有很多人都會使用部落格,這樣會使得在一個.py檔案中寫入很多路由,在往後的維護程式碼中會很麻煩,此時我們就需要模組化處理,有時.py檔案中的app會直接報錯,導致程式碼沒辦法寫入,因此傳統的模組化處理並不適合,我們需要flask程式提供一個特有的模組化處理方法,flask內建了一個模組化處理的類,即Blueprint(藍圖);

藍圖(Blueprint)的概念

Blueprint簡單來說,它就是一個儲存操作方法的容器,flask可以通過藍圖來組織URL以及處理請求。flask使用Blueprint讓應用實現模組化。

什麼是藍圖

用於實現單個應用的檢視,模板,靜態檔案的集合。

藍圖的執行機制

藍圖是儲存了一組將來可以在應用物件上執行的操作。註冊路由就是一種操作,當在程式例項上呼叫route裝飾器註冊路由時,這個操作將修改物件的url_map路由對映列表。當我們在藍圖物件上呼叫route裝飾器註冊路由時,它只是在內部的一個延遲操作記錄列表defered_functions中添加了一個項。當執行應用物件的 register_blueprint() 方法時,應用物件從藍圖物件的 defered_functions 列表中取出每一項,即呼叫應用物件的 add_url_rule() 方法,這將會修改程式例項的路由對映列表。

 

 

在flask中,blueprint具有以下屬性:

1.一個應用可以具有多個blueprint;

2.可以將一個blueprint註冊到任意一個未使用的URL下比如“/”,“/sample”或子域名。

3.在一個應用中,一個模組可以被註冊多次。

4。blueprint可以具有單獨屬於自己的模板,靜態檔案或者通過其他的通用操作方法,他並不是需要實現應用的試圖和函式。

5.在一個應用初始化時,就應該要註冊需要的blueprint,但是一個blueprint並不是一個完整的應用,它不能獨立與應用執行,而必須要註冊到某一個應用中。

 

 

藍圖物件用起來和flask差不多,最大的區別是藍圖物件沒有辦法獨立執行,必須將他註冊到一個應用物件上才能生效。

使用藍圖可以分為三部分

1.建立一個藍圖物件

#Blueprint必須指定兩個引數,admin表示藍圖的名稱,__name__表示藍圖所在模組

mypart = Blueprint('mypart',__name__)

2. 在藍圖物件上註冊一個路由

@mypart.route("/part") def mindex(): return "這裡是部分功能" 3.在應用物件上註冊這個藍圖物件 app.register_blueprint(mypart,url_prefix='/part') 當應用啟動時,可以通過‘/part’ 訪問     藍圖url字首 我們在應用物件上註冊一個藍圖時,可以制定一個url_prefix關鍵字引數(預設是/),在藍圖上註冊路由url時會自動加上這個字首,目的是防止註冊多個藍圖時,不會起衝突。 只需要註冊藍圖時加上不同的路徑。     應用物件註冊藍圖 # -*- encoding: utf-8 -*- #使用藍圖需要依來blueprint庫 from flask import Flask,Blueprint
#匯入自定義的藍圖檔案 from day6_part import mypart


#建立物件 app = Flask(__name__)
#載入檔案 app.config.from_pyfile('config.ini')

#註冊定義好的藍圖檔案,給藍圖的url加字首 app.register_blueprint(mypart,url_prefix='/part')


@app.route('/') def index(): return 'aa'
if __name__ == "__main__": app.run()

 

 

註冊藍圖

# -*- encoding: utf-8 -*- from flask import Flask,Blueprint
#建立物件 app = Flask(__name__)
#載入配置檔案 app.config.from_pyfile('config.ini')
#註冊藍圖

#Blueprint必須指定兩個引數,admin表示藍圖的名稱,__name__表示藍圖所在模組

mypart = Blueprint('mypart',__name__)
@mypart.route("/part") def mindex(): return "這裡是部分功能"

@mypart.route("/test") def atest(): return "這裡是部分功能test"
# @app.route("/") # def index(): # return "這裡是藍圖副功能" # if __name__ == "__main__": # app.run()