flask中藍圖的使用

Blueprint概念

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

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

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

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

初識藍圖

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

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

  • 1,創建一個藍圖對象
admin=Blueprint('admin',__name__)
  • 2,註冊路由,指定靜態文件夾,註冊模版過濾器
@admin.route('/')
def admin_home():
    return 'admin_home'
  • 3,在應用對象上註冊這個藍圖對象
app.register_blueprint(admin,url\_prefix='/admin')

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

藍圖使用案例

主函數

from flask import Flask
from datail import datail_b  # 導入datail文件中的藍圖路由
from news import admin_b # 導入news模塊的藍圖
app = Flask(__name__)

app.register_blueprint(datail_b) # 註冊導入的datil文件中的藍圖
app.register_blueprint(admin_b) # 註冊.....
"""
一. 爲什麼創建藍圖:
1.對flask應用程序進行模塊化管理
2.提升開發效率,降低開發難度,協同開發

3.解決了循環導入問題


4.創建藍圖的步驟
from flask import Blueprint 導入藍圖

定義路由
@app_bu.rout
def xxxx():
    xxx
    
在主頁面用app將其他文件中的藍圖註冊,
使代碼實現模塊化管理

"""

#@app.route('/index') # 主文件不再定義視圖函數
#def index():
#    return "index"

if __name__ == "__main__":
    print(app.url_map) # 打印app註冊的路由
    app.run()


單文件藍圖

from flask import  Blueprint

datail_b = Blueprint("datail",__name__)
 # 定義藍圖

"""
一個藍圖在本文件中可以定義若干個視圖函數

"""

# 使用藍圖實現路由函數
@datail_b.route('/datail')
def datail():
    return "datails"
模塊化藍圖使用

在這裏插入圖片描述

init文件

from flask import Blueprint

admin_b = Blueprint("admin",__name__,url_prefix="/admin") # url_prefix設置路由前綴
# 創建藍圖

from .views import * # 將views文件中的所有視圖函數反導入進來

views文件

from news import admin_b
"""
將所有的視圖函數定義在views文件中,
雖然從news導入了藍圖,但是僅僅是views文件建立了對於__init__函數的依賴
但是__init__函數對於此文件還是沒有任何的關聯,
所以僅僅是做到這一步在運行的時候url_map還是不能將此路由打印出來
還要再將此文件中的所以的視圖函數再反導入__init__函數中,纔會有應有的效果

"""
@admin_b.route("/")
def admin():
    return "admin"

@admin_b.route('/index')
def admin_index():
    return "admin_index"

運行機制

  • 藍圖是保存了一組將來可以在應用對象上執行的操作,註冊路由就是一種操作
  • 當在應用對象上調用 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/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章