蓝图
为什么要使用蓝图
-
模块化组织:将应用分解为可重用的模块(组件)。每个蓝图封装了相关的视图、静态文件、模板等。
-
按功能划分:将大型应用按功能模块划分(例如:用户认证、博客、管理后台),每个功能一个蓝图。
-
路由分组:将相关联的路由组合在一起,形成逻辑单元,避免所有路由都堆积在主应用文件中。
-
动态注册:蓝图可以先定义后注册,在应用初始化时再注册到应用实例上,适合工厂模式。
-
代码复用:同一个蓝图可以在多个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文件作为项目主入口文件
pythonfrom 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文件,用于不同模块的蓝图路由
python
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>"
python
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页面
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页面
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>