jinjia2模板继承

flaskjinjia2操作

Posted by Carlos on March 19, 2022

以下是一个使用Flask和Jinja2模板引擎的示例,演示了如何在templeate中使用模板继承:

首先,我们需要创建一个基础模板(base.html),它包含整个网站的基本结构和共享的代码。接下来,我们创建一个子模板(blog.html),该模板继承自基础模板,并可以添加自己的内容。

基础模板 base.html 的示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    <header>
        <h1>模板继承学习</h1>
    </header>

    <nav>
        <ul>
            <li><a href="/">首页</a></li>
            <li><a href="/about">关于</a></li>
        </ul>
    </nav>

    <main>
        {% block content %}{% endblock %}
    </main>

    <footer>
        版权所有 © 2023 我的博客
    </footer>
</body>
</html>

在上面的代码中,我们使用 {% block %} 标签来定义可替换的区块。title 区块用于设置页面的标题,content 区块用于插入子模板的内容。

接下来,我们创建子模板 blog.html,并继承自基础模板 base.html。示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{% extends 'base.html' %}

{% block title %}博客{% endblock %}

{% block content %}
    <h2>{{ post.title }}</h2>
    <p>{{ post.content }}</p>
    <p>作者:{{ post.author }}</p>
    {% if post.published %}
        <p>已发布</p>
    {% else %}
        <p>未发布</p>
    {% endif %}
{% endblock %}

在上面的代码中,我们使用 {% extends 'base.html' %} 来指定该模板继承自 base.html。然后,我们可以定义自己的 {% block %} 区块,这里命名为 content

在博客子模板中,我们只需要编写特定的内容部分,而其余的结构和共享代码都会继承自基础模板。这样可以实现页面的模块化和重用。

最后,在 Flask 应用程序中,我们将使用 render_template 函数渲染子模板,并将相关数据传递给模板:

1
2
3
4
5
6
7
8
9
10
11
12
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/blog')
def blog():
    post = {'title': '文章标题', 'content': '文章内容', 'author': '作者', 'published': True}
    return render_template('blog.html', post=post)

if __name__ == '__main__':
    port_value = 5050
    app.run(debug=True, host='0.0.0.0', port=port_value)

在上面的示例中,我们定义了一个路由函数 /blog 来处理博客页面的请求。在这个路由函数中,我们创建了一个名为 post 的字典,包含了一篇博客文章的信息。

然后,我们使用 render_template 函数来渲染子模板 blog.html,并将 post 字典传递给模板。

通过继承和模板化的方式,我们可以更好地组织和管理博客页面的代码,提高代码的可读性和可维护性。