1. 程式人生 > >Flask——藍圖

Flask——藍圖

Blueprint概念

簡單來說,Blueprint 是一個儲存操作方法的容器,這些操作在這個Blueprint 被註冊到一個應用之後就可以被呼叫,Flask 可以通過Blueprint來組織URL以及處理請求。
Flask使用Blueprint讓應用實現模組化,在Flask中,Blueprint具有如下屬性:
一個應用可以具有多個Blueprint
可以將一個Blueprint註冊到任何一個未使用的URL下比如 “/”、“/sample”或者子域名
在一個應用中,一個模組可以註冊多次
Blueprint可以單獨具有自己的模板、靜態檔案或者其它的通用操作方法,它並不是必須要實現應用的檢視和函式的
在一個應用初始化時,就應該要註冊需要使用的Blueprint
但是一個Blueprint並不是一個完整的應用,它不能獨立於應用執行,而必須要註冊到某一個應用中。

道生一,一生二,二生三,三生萬物。論如何實現三個模組化?

1.藍圖檔案,即實現功能的總程式碼:

from flask import Flask
# 迴圈匯入:兩個檔案互相匯入對方檔案中的內容,會發生迴圈匯入。
# 解決的思路:交錯匯入。

# 匯入藍圖物件
from temp_detail import api
app = Flask(__name__)
# 3----註冊藍圖物件
app.register_blueprint(api)

@app.route('/')
def index():
    return 'index'

if __name__ == '__main__':
    print(app.url_map)
    from temp_detail import detail
    app.run(debug=True)

2.模組化的第二個檔案:

# from demo3_blueprint import app
# 結論:導包解決不了路由對映的問題。
from flask import Blueprint

# 1---建立藍圖物件,第一個引數表示藍圖名稱,會和檢視函式名繫結在一起:藍圖名稱.檢視函式名。字首是為了更好的根據地址區分模組。
#  http://127.0.0.1:5000/goods/detail
#  http://127.0.0.1:5000/news/list
api = Blueprint('api',__name__,url_prefix='/news')

# 二生三:需要把再次拆分的檔案,在建立藍圖物件的下面匯入,避免迴圈匯入
from temp_list import list

# 2---使用藍圖物件
@api.route('/detail')
def detail():
    return 'detail'

3.模組化的第三個檔案:

from temp_detail import api

@api.route('/list')
def list():
    return 'list'

執行機制

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