Flask框架(flask中的蓝图Blueprint)
1. 我們學習Flask框架,開始的時候是把所有的視圖函數(shù)等都寫在一個文件中
? ?我們在這單個文件中可以定義路由、視圖函數(shù)、定義模型等等。
? ?但這顯然存在一個問題:隨著業(yè)務代碼的增加,將所有代碼都放在單個程序文件中,是非常不合適的。
? ? ?這不僅會讓代碼閱讀變得困難,而且會給后期維護帶來麻煩。
2. 問題怎么解決呢
? ? ? ?一個程序執(zhí)行文件中,功能代碼過多。? 讓代碼實現(xiàn)模塊化
? ? ? ?嘗試用模塊的導入的方式解決
? ? ? ?把一個文件拆開,把視圖函數(shù)按照不同的功能進行劃分,分成不同的文件,然后建立一個主文件,在主文件中。利用模塊導入的方法,
??這是我的文件目錄?
? 可以在其他文件里面把視圖函數(shù)放出去,然后利用裝飾器傳入?yún)?shù)的方式進行在主文件中把其他視圖的路由進行綁定
from flask import Flask from Blueprint_le.goods import get_goods from Blueprint_le.users import register # 循環(huán)引用,解決的方法,推遲一方的導入,讓一方先完成 # 使用裝飾器的函數(shù)使用方法,解決模塊分割的問題 app = Flask(__name__) app.route("/get_goods")(get_goods) app.route("/register")(register)@app.route("/") def index():return "index page"if __name__ == '__main__':print(app.url_map)app.run()3.?什么是藍圖?
? ?藍圖:用于實現(xiàn)單個應用的視圖、模板、靜態(tài)文件的集合。
? ?藍圖就是模塊化處理的類。
? 簡單來說,藍圖就是一個存儲操作路由映射方法的容器,主要用來實現(xiàn)客戶端請求和URL相互關聯(lián)的功能。
? 在Flask中,使用藍圖可以幫助我們實現(xiàn)模塊化應用的功能。
4.藍圖的運行機制:
? ?藍圖是保存了一組將來可以在應用對象上執(zhí)行的操作。
? ?注冊路由就是一種操作,當在程序實例上調用route裝飾器注冊路由時,這個操作將修改對象的url_map路由映射列表。
? ?當我們在藍圖對象上調用route裝飾器注冊路由時,它只是在內部的一個延遲操作記錄列表defered_functions中添加了一? ? ? ?個項。當執(zhí)行應用對象的 register_blueprint() 方法時,應用對象從藍圖對象的 defered_functions 列表中取出每一項,即? ? ? 調用應用對象的 add_url_rule() 方法,這將會修改程序實例的路由映射列表。
5.藍圖的使用
? ?(1)創(chuàng)建藍圖對象
'''Blueprint必須指定兩個參數(shù),admin表示藍圖的名稱,__name__表示藍圖所在模塊''' admin = Blueprint('admin',__name__)? ?(2)? 注冊藍圖的路由
@admin.route('/') def admin_index():return 'admin_index'? (3) 在程序中注冊該藍圖
app.register_blueprint(admin,url_prefix='/admin')6.藍圖的使用例子
? ? ?以目錄的形式定義藍圖以及藍圖里面模板目錄的處理
1. 首先我的目錄結構和我的程序和模板存放的目錄為:
? ?
? 2. 使用目錄分割,在cart目錄里面的_ _ init _ _.py里面創(chuàng)建藍圖,并且要把視圖加載進來
from flask import Blueprint'''創(chuàng)建藍圖 修改模板路徑為當前templates的路徑,還有一個設置靜態(tài)的目錄static_folder''' app_cart = Blueprint("app_cart", __name__, template_folder="templates")'''在__init__.py執(zhí)行的時候,把視圖加載進來,讓藍圖與應用程序知道有視圖的存在''' # Blueprint_le.cart.views : 從路徑里面的views.py導入get_cart視圖函數(shù) from Blueprint_le.cart.views import get_cart3. 在views.py里面使用藍圖,定義視圖函數(shù),
? ?定義模板 cart.html存放在cart里面的templates下
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body><h1>cart page</h1> </body> </html>? ? views.py?
from flask import render_template from Blueprint_le.cart import app_cart@app_cart.route("/get_cart") def get_cart():return render_template("cart.html")4.不使用目錄的分割形式也可以,例如建立order.py,建立藍圖
from flask import Blueprint'''創(chuàng)建一個藍圖的對象,藍圖就是一個小模塊的抽象的模塊'''app_orders = Blueprint("app_orders", __name__)@app_orders.route("/get_orders") def get_orders():return "get orders page"5.然后建立一個main.py在里面實現(xiàn)主要的代碼:
from flask import Flask from Blueprint_le.orders import app_orders from Blueprint_le.cart import app_cartapp = Flask(__name__)'''注冊藍圖 , url_prefix:給訪問的路徑加一個前綴''' app.register_blueprint(app_orders, url_prefix="/orders") app.register_blueprint(app_cart, url_prefix="/cart")@app.route("/") def index():return "index page"if __name__ == '__main__':# 打印出所有的路由print(app.url_map)app.run(debug=True)6.? 首先可以訪問 沒有使用目錄分割的orders,? ? 運行程序,瀏覽器訪問? ?127.0.0.1:5000/orders/get_orders
? ??
?然后可以訪問使用目錄分割的cart,瀏覽器訪問?127.0.0.1:5000/cart/get_cart
??
7.? 如果藍圖里面的小目錄里面沒有找到模板,則會去頂級的templates的目錄里面去找
? ? 如果在藍圖的小目錄的templates的模板和總的templates的模板重名的話,則會使用總的templates里的模板
??
?
總結
以上是生活随笔為你收集整理的Flask框架(flask中的蓝图Blueprint)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Flask框架(flask模板(jinj
- 下一篇: Echarts(自己整理的一些散点图、饼