藍圖
為什么要使用藍圖
模塊化組織:將應用分解為可重用的模塊(組件)。每個藍圖封裝了相關的視圖、靜態文件、模板等。
按功能劃分:將大型應用按功能模塊劃分(例如:用戶認證、博客、管理后臺),每個功能一個藍圖。
路由分組:將相關聯的路由組合在一起,形成邏輯單元,避免所有路由都堆積在主應用文件中。
動態注冊:藍圖可以先定義后注冊,在應用初始化時再注冊到應用實例上,適合工廠模式。
代碼復用:同一個藍圖可以在多個Flask應用中使用,實現代碼復用。
URL前綴管理:注冊藍圖時可設置統一URL前綴(如所有用戶相關路由都以
/user
開頭)。獨立模板/靜態文件:每個藍圖可以有自己的模板目錄和靜態文件目錄。
中間件作用域:藍圖可以有自己的請求鉤子(before_request, after_request等),只對自身注冊的路由生效。
解決視圖命名沖突:不同藍圖可以有相同命名的視圖函數(通過
藍圖名.函數名
區分)。
開始使用
基礎項目結構
simple_flask_app/ ├── app.py ? ? ? ? # 主應用文件 ├── blueprints/ │ ? ├── main.py ? ? # 主藍圖 │ ? └── user.py ? ? # 用戶藍圖 ├── templates/ # 模板文件 │ ? ├── home.html ? ? # 主藍圖頁面 │ ? └── users.html ? ? # 用戶頁面
創建app.py文件作為項目主入口文件
from flask import Flask from blueprints.main import main_bp from blueprints.user import user_bp ? # 創建Flask應用 app = Flask(__name__) ? # 注冊藍圖 app.register_blueprint(main_bp, url_prefix='/') ? ? ? ?# 主藍圖使用根路徑 app.register_blueprint(user_bp, url_prefix='/users') ? ?# 用戶藍圖使用/users前綴 ? # 運行應用 if __name__ == '__main__':app.run(debug=True, port=5000)
創建藍圖
在blueprints文件夾中,創建main.py和user.py文件,用于不同模塊的藍圖路由
main.py
from flask import Blueprint, render_template ? # 創建主藍圖 '''第一個參數:'main' (藍圖名稱)這是藍圖的標識名,必須是唯一的字符串,用于:在應用中識別這個特定的藍圖在 url_for() 函數中引用該藍圖的端點在應用的其他部分訪問這個藍圖 ''' main_bp = Blueprint('main', __name__) ? ? # 主藍圖的路由 @main_bp.route('/') def home():return render_template('home.html') ? ? @main_bp.route('/about') def about():return "<h1>關于我們</h1><p>這是關于我們的頁面</p>" ? ? @main_bp.route('/contact') def contact():return "<h1>聯系我們</h1><p>電話: 123-456-7890</p>" ?
user.py
from flask import Blueprint, render_template ? # 創建用戶藍圖 user_bp = Blueprint('user', __name__) ? ? # 用戶藍圖的路由 @user_bp.route('/') def user_home():return render_template('users.html') ? ? @user_bp.route('/profile') def profile():return "<h1>用戶資料</h1><p>這是用戶的個人資料頁面</p>" ? ? @user_bp.route('/dashboard') def dashboard():return "<h1>控制面板</h1><p>用戶控制面板內容</p>"
?
創建視圖頁面
在templates中,創建home.html文件,用于主藍圖的顯示和跳轉效果的演示
下述代碼中{{user.xxx}}或者{{main.xxx}}前綴名稱是在創建藍圖的時候設置的,
main_bp = Blueprint('main', __name__)
home.html頁面
<!DOCTYPE html> <html> <head><title>首頁</title><style>body {font-family: Arial, sans-serif;margin: 40px;}nav {background: #f0f0f0;padding: 10px;margin-bottom: 20px;}nav a {margin-right: 15px;text-decoration: none;color: #333;}</style> </head> <body><nav><a href="{{ url_for('main.home') }}">首頁</a><a href="{{ url_for('main.about') }}">關于</a><a href="{{ url_for('main.contact') }}">聯系</a><a href="{{ url_for('user.user_home') }}">用戶主頁</a><a href="{{ url_for('user.profile') }}">用戶資料</a></nav> ?<h1>歡迎來到主頁</h1><p>這是一個使用 Flask 藍圖的簡單示例。</p> ?<h2>項目結構</h2><ul><li>主藍圖處理網站主要頁面</li><li>用戶藍圖處理所有用戶相關頁面</li><li>藍圖使用URL前綴進行分組</li></ul> </body> </html>
users.html頁面
<!DOCTYPE html> <html> <head><title>用戶主頁</title><style>body {font-family: Arial, sans-serif;margin: 40px;}nav {background: #e0f7fa;padding: 10px;margin-bottom: 20px;}nav a {margin-right: 15px;text-decoration: none;color: #00796b;}.user-section {border-left: 4px solid #00796b;padding-left: 15px;margin-top: 20px;}</style> </head> <body><nav><a href="{{ url_for('main.home') }}">返回首頁</a><a href="{{ url_for('user.user_home') }}">用戶主頁</a><a href="{{ url_for('user.profile') }}">用戶資料</a><a href="{{ url_for('user.dashboard') }}">控制面板</a></nav> ?<h1>用戶主頁</h1><p>這是用戶藍圖的首頁。</p> ?<div class="user-section"><h2>用戶藍圖功能</h2><p>所有用戶相關的功能都在此藍圖中實現:</p><ul><li>用戶資料管理</li><li>控制面板</li><li>用戶設置(待添加)</li></ul></div> </body> </html>