目录

  1. 什么是蓝图
  2. 基本蓝图用法
  3. 带模板的蓝图
  4. 蓝图中的静态文件
  5. 在大型项目中使用蓝图
  6. 参考资料

什么是蓝图

蓝图(Blueprint)是 Flask 提供的一种模块化工具,用于将应用分解为多个独立的部分。它允许你将路由、模板和静态文件分组,适合大型项目或需要团队协作的场景。蓝图本质上是路由和视图的集合,可以在主应用中注册。


基本蓝图用法

蓝图通过 Blueprint 类创建,并注册到 Flask 应用中。

示例

项目结构

my_app/
├── app.py
└── main/
    └── views.py
  1. main/views.py
from flask import Blueprint

main = Blueprint('main', __name__)

@main.route('/')
def home():
    return '欢迎来到首页!'

@main.route('/about')
def about():
    return '这是关于页面。'
  1. 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
  1. 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')
  1. main/templates/main/index.html
<!DOCTYPE html>
<html>
<head>
    <title>首页</title>
</head>
<body>
    <h1>欢迎使用蓝图!</h1>
</body>
</html>
  1. 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
  1. 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’)

  1. main/static/style.css
h1 {
    color: blue;
}
  1. 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 中组织大型应用的利器。如果需要更复杂的蓝图示例(例如与数据库或认证结合),请告诉我!