在Web開發中,我們常常需要將後端的數據(如用戶信息、商品列表、文章內容等)展示到前端頁面上。如果手動拼接HTML和數據,會變得非常繁瑣且容易出錯。而模板引擎(Template Engine)正是解決這個問題的工具——它允許我們在HTML中嵌入動態內容,讓後端數據“注入”到頁面中,生成最終的網頁。

一、什麼是Jinja2和模板引擎?

模板引擎的核心作用是將後端數據與HTML模板結合,生成可直接展示給用戶的網頁。它就像一個“模板工具”,讓開發者專注於數據邏輯和頁面結構的分離,而不是重複編寫靜態HTML和動態數據拼接的代碼。

Jinja2 是Flask框架的默認模板引擎,由Python實現,語法簡潔且功能強大。它支持變量替換、條件判斷、循環、過濾器等功能,能高效地處理動態數據渲染。

二、在Flask中使用Jinja2的基本流程

要在Flask中使用Jinja2,只需遵循以下步驟:

1. 準備環境:安裝Flask

首先確保已安裝Flask。如果未安裝,可通過pip安裝:

pip install flask

2. 創建Flask應用與路由

在項目根目錄下創建app.py,定義一個簡單的Flask應用和路由,用於提供數據和渲染模板:

from flask import Flask, render_template  # 導入Flask和模板渲染工具

app = Flask(__name__)  # 創建Flask應用實例

# 定義路由,訪問首頁時執行index函數
@app.route('/')
def index():
    # 準備後端數據(可以是字典、列表、對象等)
    user_info = {
        'name': '小明',
        'age': 20,
        'hobbies': ['籃球', '編程', '閱讀'],  # 愛好列表
        'is_student': True,  # 是否是學生
        'posts': [  # 文章列表
            {'title': 'Python入門教程', 'author': '小明', 'date': '2023-01-15'},
            {'title': 'Flask實戰', 'author': '小明', 'date': '2023-02-20'}
        ]
    }
    # 渲染模板並返回數據
    return render_template('index.html', **user_info)  # **user_info將字典拆分爲參數

if __name__ == '__main__':
    app.run(debug=True)  # 調試模式運行

3. 創建模板文件

Flask默認會在項目根目錄下的templates文件夾中尋找模板文件(若不存在需手動創建)。因此,需在項目根目錄新建templates文件夾,並在其中創建index.html作爲模板文件:

項目結構:
your_project/
├── app.py          # Flask應用代碼
└── templates/      # 模板文件夾
    └── index.html  # 模板文件

4. 在模板中使用Jinja2語法

templates/index.html中,使用Jinja2語法嵌入動態數據:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>{{ name }}的個人主頁</title>
</head>
<body>
    <h1>歡迎訪問{{ name }}的主頁!</h1>

    <!-- 變量替換:直接顯示後端傳遞的name -->
    <p>年齡:{{ age }}歲</p>

    <!-- 條件判斷:根據年齡判斷是否成年 -->
    {% if age >= 18 %}
        <p>狀態:成年人</p>
    {% else %}
        <p>狀態:未成年人</p>
    {% endif %}

    <!-- 循環遍歷:展示愛好列表 -->
    <h2>我的愛好</h2>
    <ul>
        {% for hobby in hobbies %}
            <li>{{ loop.index }}. {{ hobby }}</li>  <!-- loop.index顯示序號 -->
        {% endfor %}
    </ul>

    <!-- 條件+循環:展示文章列表 -->
    <h2>我的文章</h2>
    <table border="1">
        <tr>
            <th>標題</th>
            <th>作者</th>
            <th>發佈日期</th>
        </tr>
        {% for post in posts %}
            <tr>
                <td>{{ post.title }}</td>
                <td>{{ post.author }}</td>
                <td>{{ post.date }}</td>
            </tr>
        {% endfor %}
    </table>

    <!-- 嵌套對象數據:判斷是否爲學生 -->
    {% if is_student %}
        <p>身份:在校學生</p>
    {% else %}
        <p>身份:社會人士</p>
    {% endif %}
</body>
</html>

5. 運行應用並測試

啓動app.py

python app.py

訪問http://127.0.0.1:5000,即可看到動態渲染的頁面,包含小明的信息、愛好列表和文章列表。

三、Jinja2核心語法速覽

上面的示例中已經用到了Jinja2的基本語法,以下是最常用的核心功能:

1. 變量替換

{{ 變量名 }}在模板中嵌入後端傳遞的變量。例如:

<p>用戶名:{{ user.name }}</p>  <!-- 後端傳遞user字典 -->
<p>價格:{{ product.price }}</p>  <!-- 後端傳遞product對象 -->

2. 條件判斷(if-else)

{% if ... %}{% else %}{% elif %}實現條件邏輯。例如:

{% if is_logged_in %}
    <p>歡迎回來!</p>
{% else %}
    <p>請先登錄</p>
{% endif %}

3. 循環遍歷(for)

{% for ... %}遍歷列表、字典或其他可迭代對象。常用變量:
- loop.index:當前循環的序號(從1開始)
- loop.first:是否爲循環的第一個元素(布爾值)
- loop.last:是否爲循環的最後一個元素(布爾值)

例如遍歷愛好列表:

{% for hobby in hobbies %}
    <li>{{ hobby }}</li>
{% endfor %}

4. 過濾器(Filter)

Jinja2支持過濾器對變量進行處理(如格式化、轉換等),用|連接過濾器名。例如:
- {{ name|upper }}:將字符串轉爲大寫
- {{ date|format('%Y-%m-%d') }}:格式化日期(需結合Python的datetime)
- {{ text|truncate(20) }}:截斷長文本爲20個字符

示例:

<p>標題:{{ post.title|truncate(15) }}</p>  <!-- 截斷標題長度 -->

四、進階技巧:模板繼承

當項目中有多個頁面(如首頁、文章頁、個人中心)時,重複編寫相同的HTML結構(如導航欄、頁腳)會很麻煩。Jinja2支持模板繼承,通過base.html作爲基礎模板,其他頁面“繼承”並擴展它。

1. 創建基礎模板(base.html)

templates文件夾中創建base.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}默認標題{% endblock %}</title>
</head>
<body>
    <nav>
        <a href="/">首頁</a> | <a href="/about">關於</a>
    </nav>
    <main>
        {% block content %}{% endblock %}  <!-- 內容區塊,子模板可覆蓋 -->
    </main>
    <footer>© 2023 我的網站</footer>
</body>
</html>

2. 子模板繼承(index.html)

index.html中通過{% extends "base.html" %}繼承基礎模板,並覆蓋block

{% extends "base.html" %}  <!-- 繼承base.html -->

{% block title %}小明的主頁{% endblock %}  <!-- 覆蓋標題區塊 -->

{% block content %}  <!-- 覆蓋內容區塊 -->
    <h1>歡迎來到小明的主頁!</h1>
    <p>這是繼承base.html後的內容。</p>
{% endblock %}

五、總結

Jinja2模板引擎讓Flask後端數據的前端渲染變得簡單直觀。通過變量替換、條件判斷、循環等語法,我們可以輕鬆實現動態頁面;而模板繼承則進一步提高了代碼複用性,讓項目結構更清晰。

掌握Jinja2後,你可以繼續探索更多高級功能,如宏(Macro,複用代碼片段)、測試過濾器、自定義函數等。隨着實踐的深入,你會發現模板引擎是Web開發中連接數據與用戶界面的核心工具。

提示:初學者建議先從簡單示例(如本文的個人主頁)入手,逐步嘗試複雜場景(如數據庫查詢結果渲染、表單數據動態回顯),再深入學習模板繼承和高級語法。

小夜