目录
什么是蓝图
蓝图(Blueprint)是 Flask 提供的一种模块化工具,用于将应用分解为多个独立的部分。它允许你将路由、模板和静态文件分组,适合大型项目或需要团队协作的场景。蓝图本质上是路由和视图的集合,可以在主应用中注册。
基本蓝图用法
蓝图通过 Blueprint
类创建,并注册到 Flask 应用中。
示例
项目结构
my_app/
├── app.py
└── main/
└── views.py
main/views.py
from flask import Blueprint
main = Blueprint('main', __name__)
@main.route('/')
def home():
return '欢迎来到首页!'
@main.route('/about')
def about():
return '这是关于页面。'
app.py
from flask import Flask
from main.views import main
app = Flask(name)
注册蓝图
app.register_blueprint(main)
if name == ‘main‘:
app.run(debug=True)
- 解释:
Blueprint('main', __name__)
:创建名为main
的蓝图。@main.route()
:定义蓝图内的路由。app.register_blueprint(main)
:将蓝图注册到应用。
访问 http://127.0.0.1:5000/
和 /about
将分别显示相应页面。
带模板的蓝图
蓝图可以指定自己的模板文件夹,默认仍会回退到应用的 templates
文件夹。
示例
项目结构
my_app/
├── app.py
├── main/
│ ├── views.py
│ └── templates/
│ └── main/
│ └── index.html
main/views.py
from flask import Blueprint, render_template
main = Blueprint('main', __name__, template_folder='templates')
@main.route('/')
def home():
return render_template('main/index.html')
main/templates/main/index.html
<!DOCTYPE html>
<html>
<head>
<title>首页</title>
</head>
<body>
<h1>欢迎使用蓝图!</h1>
</body>
</html>
app.py
from flask import Flask
from main.views import main
app = Flask(name)
app.register_blueprint(main)
if name == ‘main‘:
app.run(debug=True)
- 解释:
template_folder='templates'
:指定蓝图的模板目录。- 模板路径以蓝图文件夹为根(如
main/index.html
)。
蓝图中的静态文件
蓝图可以定义自己的静态文件目录,默认仍会回退到应用的 static
文件夹。
示例
项目结构
my_app/
├── app.py
├── main/
│ ├── views.py
│ ├── static/
│ │ └── style.css
│ └── templates/
│ └── main/
│ └── index.html
main/views.py
from flask import Blueprint, render_template
main = Blueprint(‘main’, name, static_folder=’static’, template_folder=’templates’)
@main.route(‘/’)
def home():
return render_template(‘main/index.html’)
main/static/style.css
h1 {
color: blue;
}
main/templates/main/index.html
<!DOCTYPE html>
<html>
<head>
<title>首页</title>
<link rel="stylesheet" href="{{ url_for('main.static', filename='style.css') }}">
</head>
<body>
<h1>欢迎使用蓝图!</h1>
</body>
</html>
</xaiArtifact>
- **解释**:
- `static_folder='static'`:指定蓝图的静态文件目录。
- `url_for('main.static', filename='style.css')`:引用蓝图中的静态文件。
---
### 在大型项目中使用蓝图
蓝图特别适合大型项目,可以按功能模块划分。
#### 示例结构
my_app/
├── app/
│ ├── init.py
│ ├── main/
│ │ ├── init.py
│ │ └── views.py
│ └── admin/
│ ├── init.py
│ └── views.py
└── run.py
1. **`app/__init__.py`**
<xaiArtifact artifact_id="d517d44e-57f1-47d9-950d-48780bcdde76" artifact_version_id="bf53e29e-239c-4371-85b0-5f3e95a61afe" title="__init__.py" contentType="text/python">
from flask import Flask
from .main.views import main
from .admin.views import admin
def create_app():
app = Flask(__name__)
app.register_blueprint(main)
app.register_blueprint(admin, url_prefix='/admin')
return app
</xaiArtifact>
2. **`app/main/views.py`**
<xaiArtifact artifact_id="dcdc1d7a-90e5-46cb-8280-ffb165e3eb78" artifact_version_id="aa85a4cf-6a7d-4d42-87a3-94f9be42f9cd" title="views.py" contentType="text/python">
from flask import Blueprint
main = Blueprint('main', __name__)
@main.route('/')
def home():
return '首页'
</xaiArtifact>
3. **`app/admin/views.py`**
python
from flask import Blueprint
admin = Blueprint(‘admin’, name)
@admin.route(‘/’)
def admin_home():
return ‘管理面板’
4. **`run.py`**
python
from app import create_app
app = create_app()
if name == ‘main‘:
app.run(debug=True)
- 解释:
url_prefix='/admin'
:为admin
蓝图添加前缀,访问/admin/
。- 模块化分离了主功能和管理功能。
参考资料
- Flask 官方文档 – Blueprints – 蓝图官方指南。
- Real Python – Flask Blueprints – 蓝图的实践教程。
- Miguel Grinberg – Flask Mega-Tutorial – 使用蓝图构建大型应用。
- Flask Blueprints 示例 – 官方蓝图示例。
蓝图是 Flask 中组织大型应用的利器。如果需要更复杂的蓝图示例(例如与数据库或认证结合),请告诉我!
发表回复