天天看點

使用Jinja2模闆引擎生成html報告

作者:一點鑫得

Flask、Django Web架構都使用模闆語言引擎進行web頁面的渲染,Flask使用Jinja2作為其模闆引擎,Jinja2是一個快速、表達力強、可擴充的模闆引擎,它使用了類似于Python文法的特殊占位符,可以将模闆和資料結合起來渲染出最終的文檔。Jinja2是基于Python的,可以安裝在任何支援Python的平台上。Jinja2還提供了一個可選的沙箱模闆執行環境,可以保證模闆的安全性。

Jinja2的使用不必依附于Web架構,它完全可以獨立使用,相信很多人都有寫各種報告文檔的經曆,如果某類型的文檔要反複地寫的話,可以考慮使用Jinja2來自動生成報告,事先準備好漂亮的模闆檔案,每次隻要更新資料就可以自動生成漂亮的報告文檔了。由于本文重點介紹Jinja2的基本使用方法,僅使用最簡單的html模闆進行說明,讀者完全可以自己設計或下載下傳滿意的html頁面作為模闆使用。

Jinja2的基本用法是這樣的:

  • 首先,需要導入jinja2子產品,并建立一個Environment對象,這個對象可以配置模闆的加載方式、過濾器、變量等。
  • 然後,需要加載一個模闆檔案,這個檔案可以是一個本地的檔案,也可以是一個字元串,或者是一個從其他地方擷取的對象。
  • 最後,需要調用模闆的render方法,傳入一些資料,這些資料可以是字典、清單、對象等,模闆會根據這些資料生成最終的文檔。

下面是一個簡單的例子,示範了如何使用jinja2渲染一個HTML頁面:

# 導入jinja2子產品
import jinja2

# 建立一個Environment對象,指定模闆的加載方式為檔案系統
env = jinja2.Environment(loader=jinja2.FileSystemLoader('./templates'))

# 加載一個模闆檔案,這個檔案的内容是一個HTML頁面,其中有一些占位符
template = env.get_template('template.html')

# 定義一些資料,這些資料會替換模闆中的占位符
data = {
    'title': 'Hello Jinja2',
    'name': 'Jinja2',
    'items': ['Python', 'Jinja2', 'Flask']
}

# 調用模闆的render方法,傳入資料,得到最終的文檔
document = template.render(data)

# 列印或儲存文檔
print(document)
with open("report.html", 'w', encoding='utf-8') as f:
    f.write(document)           

這個模闆檔案template.html的内容是這樣的:

<html>
<head>
    <title>{{ title }}</title>
</head>
<body>
    <h1>Hello {{ name }}!</h1>
    <ul>
        <!-- for循環控制結構開始 -->
        {% for item in items %}
            <!-- if條件控制結構開始 -->
            {% if item == "Jinja2" %}
                <!-- loop.index變量表示循環疊代的序号  -->
                <li>{{loop.index}} <b>{{ item }}</b></li>
            {% else %}
                <!-- upper是内部過濾器,将item轉換為大寫,以|分割,前一個作為後續的輸入  -->
                <li>{{loop.index}} {{ item|upper }}</li>
            {% endif %}
            <!-- if條件控制結束 -->
        {% endfor %}
        <!-- for循環控制結構結束 -->
	</ul>
</body>
</html>           

這個模闆檔案中,使用了兩種占位符:

  • {{ … }} 表示一個變量,它會被傳入的資料中對應的值替換,變量可以使用upper這樣的過濾器進行修改,以|分割,前一個作為後一個的輸入。
  • {% … %} 表示一個控制結構,它可以實作一些邏輯,比如循環、判斷、繼承等。

渲染後的文檔是這樣的:

<html>
<head>
    <title>Hello Jinja2</title>
</head>
<body>
    <h1>Hello Jinja2!</h1>
    <ul>
		<li>1 PYTHON</li>
		<li>2 <b>Jinja2</b></li>
		<li>3 FLASK</li>
	</ul>
</body>
</html>           
使用Jinja2模闆引擎生成html報告

可以看到,模闆中的占位符被資料中的值替換了,生成了一個簡單的HTML頁面。

參考文獻

[1]. Jinja2内置過濾器清單模闆設計者文檔 — Jinja2 中文手冊 2.8 documentation (pythontab.com);