python flask 蓝图

大家好,我是python网页后端flask的讲师geo

Flask 的蓝图 (Blueprint) 是组织大型 Flask 应用、实现模块化和代码重用的核心机制。

Flask 蓝图 (Blueprint) 简介

蓝图的作用类似于一个微型应用,它可以定义路由、模板文件夹、静态文件等,但它不是一个真正的应用,需要注册到一个主 Flask 应用实例上才能生效。

主要用途:

  1. 模块化: 将一个大型应用分解为多个独立的、功能相关的组件(例如:用户管理、博客文章、API 接口)。
  2. 代码重用: 可以在同一个应用中以不同的 URL 前缀多次注册同一个蓝图,或者在不同的项目中重复使用蓝图。
  3. URL 前缀: 可以为蓝图下的所有路由统一添加一个 URL 前缀,避免命名冲突。

蓝图基本实现步骤

实现一个 Flask 蓝图通常包括三个步骤:创建蓝图定义路由注册蓝图

创建蓝图 (user_routes.py)

在一个单独的 Python 文件(例如 user_routes.py)中创建蓝图实例。

# user_routes.py
from flask import Blueprint, render_template

# 实例化一个蓝图对象
# 'user_bp' 是蓝图的名称 (name),用于 url_for()
# __name__ 是蓝图的导入名称,Flask 用它来定位资源(如模板和静态文件)
user_bp = Blueprint('user_bp', __name__, 
                    template_folder='templates') # 可选:指定蓝图专用的模板文件夹

@user_bp.route('/')
def index():
    # 这里的路由是相对于蓝图的
    return "这是用户模块的首页"

@user_bp.route('/<int:user_id>')
def get_user(user_id):
    return f"获取用户 ID: {user_id} 的信息"

主应用 (app.py)

在主应用文件(例如 app.py)中创建 Flask 应用实例,并注册蓝图。

# app.py
from flask import Flask
# 从 user_routes.py 导入蓝图实例
from user_routes import user_bp 

def create_app():
    app = Flask(__name__)
    
    # 注册蓝图
    # url_prefix='/users' 表示 user_bp 蓝图下的所有路由都会以 /users/ 开头
    app.register_blueprint(user_bp, url_prefix='/users')
    
    return app

if __name__ == '__main__':
    app = create_app()
    app.run(debug=True)

运行效果

运行 app.py

  • 访问 /:会是主应用中未注册蓝图的任何路由(如果有的话)。
  • 访问 /users/:会触发 user_bp 蓝图中的 index() 函数。
  • 访问 /users/123:会触发 user_bp 蓝图中的 get_user(123) 函数。

蓝图中的 url_for()

在使用蓝图后,url_for() 函数的用法也需要改变,以避免不同蓝图之间路由名称的冲突。

格式变为:url_for('蓝图名称.视图函数名称')

  • 在主应用中或其他蓝图中引用 user_bp 的路由:
    # 生成 /users/100 的链接
    url_for('user_bp.get_user', user_id=100) 
    
  • user_bp 蓝图内部引用自身的路由:
    # 生成 /users/ 的链接
    url_for('user_bp.index')
    # 或者直接使用相对引用 (更推荐)
    url_for('.index') 
    

进阶功能

  • 静态文件和模板: 蓝图可以有自己的静态文件和模板文件夹,通过在 Blueprint 构造函数中设置 static_foldertemplate_folder 参数指定。
  • 错误处理: 蓝图也可以使用 @user_bp.errorhandler(404) 来定义自己的错误处理函数。
  • 请求处理器: 蓝图支持 @user_bp.before_request@user_bp.after_request 等请求钩子。