大家好,我是python网页后端flask的讲师geo
Flask 的蓝图 (Blueprint) 是组织大型 Flask 应用、实现模块化和代码重用的核心机制。
Flask 蓝图 (Blueprint) 简介
蓝图的作用类似于一个微型应用,它可以定义路由、模板文件夹、静态文件等,但它不是一个真正的应用,需要注册到一个主 Flask 应用实例上才能生效。
主要用途:
- 模块化: 将一个大型应用分解为多个独立的、功能相关的组件(例如:用户管理、博客文章、API 接口)。
- 代码重用: 可以在同一个应用中以不同的 URL 前缀多次注册同一个蓝图,或者在不同的项目中重复使用蓝图。
- 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_folder和template_folder参数指定。 - 错误处理: 蓝图也可以使用
@user_bp.errorhandler(404)来定义自己的错误处理函数。 - 请求处理器: 蓝图支持
@user_bp.before_request、@user_bp.after_request等请求钩子。