Python - 模板



Python 中的模板

Python 中的模板是一種在 Web 開發中使用的技術,用於使用模板和資料動態生成靜態 HTML 頁面。

在本教程中,我們將探討 Python 中模板的基礎知識,包括安裝、建立模板以及使用資料渲染模板,重點介紹 Jinja2 模板引擎。

Python 中的字串模板

Python 中的字串模板是一種執行字串替換的簡單方法。Python 的字串模組包含 **Template** 類,它提供了一種簡單的方法來替換字串中的佔位符。

字串模組中的 Template 類對於透過 PEP 292 中描述的替換技術動態地形成字串物件很有用。與 Python 中的其他內建字串格式化功能相比,其更簡單的語法和功能使其更容易進行國際化翻譯。

模板字串使用 **$** 符號進行替換,緊跟一個遵循形成有效 Python 識別符號規則的識別符號。

建立模板

要建立模板,您可以使用包含以 **$** 為字首的佔位符的字串例項化 **Template** 類,如下所示 -

from string import Template

template = Template("Hello, $name!")

替換值

您可以使用 **substitute()** 方法將值替換到模板中,該方法接受鍵值對的字典。

substitute() 方法用實際值替換模板中的佔位符(識別符號)。您可以使用關鍵字引數或字典提供這些值。然後,該方法返回一個新的字串,其中包含已填充的佔位符。

示例:使用關鍵字引數

以下程式碼使用關鍵字引數替換模板字串中的識別符號 -

from string import Template

tempStr = Template('Hello. My name is $name and my age is $age')
newStr = tempStr.substitute(name = 'Pushpa', age = 26)
print (newStr)

它將產生以下輸出 -

Hello. My name is Pushpa and my age is 26

示例:使用字典

在以下示例中,我們使用字典物件來對映模板字串中的替換識別符號 -

from string import Template

tempStr = Template('Hello. My name is $name and my age is $age')
dct = {'name' : 'Pushpalata', 'age' : 25}
newStr = tempStr.substitute(dct)
print (newStr)

以下是上述程式碼的輸出 -

Hello. My name is Pushpalata and my age is 25

示例:缺少引數引發 KeyError

如果未向 substitute() 方法提供足夠的引數來與模板字串中的識別符號匹配,則 Python 會引發 KeyError -

from string import Template

tempStr = Template('Hello. My name is $name and my age is $age')
dct = {'name' : 'Pushpalata'}
newStr = tempStr.substitute(dct)
print (newStr)

以下是產生的錯誤 -

Traceback (most recent call last):
  File "/home/cg/root/667e441d9ebd5/main.py", line 5, in <module>
newStr = tempStr.substitute(dct)
  File "/usr/lib/python3.10/string.py", line 121, in substitute
    return self.pattern.sub(convert, self.template)
  File "/usr/lib/python3.10/string.py", line 114, in convert
return str(mapping[named])
KeyError: 'age'

使用 safe_substitute() 方法替換值

safe_substitute() 方法的行為類似於 substitute() 方法,除了它不會在鍵不足或不匹配時引發錯誤。相反,原始佔位符將原封不動地出現在結果字串中。

示例

在以下示例中,我們使用 safe_substitue() 方法替換值 -

from string import Template
tempStr = Template('Hello. My name is $name and my age is $age')
dct = {'name' : 'Pushpalata'}
newStr = tempStr.safe_substitute(dct)
print (newStr)

它將產生以下輸出 -

Hello. My name is Pushpalata and my age is $age

安裝 Jinja2

要在 Python 中使用 **Jinja2** 進行模板化,您首先需要安裝該庫。Jinja2 是一個功能強大的模板引擎,廣泛用於 Web 開發中渲染 HTML。可以使用 Python 的包安裝程式 pip 輕鬆安裝 -

pip install jinja2

建立和渲染 Jinja2 模板

Jinja2 是一個功能強大的 Python 模板引擎,允許您透過將靜態模板檔案與資料混合來建立動態內容。本節探討如何建立 Jinja2 模板以及如何使用資料渲染它們。

建立 Jinja2 模板

要建立 Jinja2 模板,您可以定義一個模板字串或從檔案中載入它。模板使用雙花括號 {{ ... }} 作為佔位符,並支援諸如“迴圈”和“條件”之類的控制結構,使用 {% ... %}

示例

以下是一個儲存在檔案“template.html”中的簡單 Jinja2 模板示例:

<!DOCTYPE html>
<html>
<head>
    <title>Hello, {{ name }}!</title>
</head>
<body>
    <h1>Hello, {{ name }}!</h1>
    <p>Welcome to our site.</p>
</body>
</html>

渲染 Jinja2 模板

要渲染 Jinja2 模板,請按照以下步驟操作:

  • 載入模板 - 從檔案載入模板或從字串建立模板。

  • 建立模板物件 - 使用“jinja2.Template”建立模板物件。

  • 渲染 - 使用模板物件上的 render() 方法,將資料作為引數或字典傳遞。

示例

在這裡,我們正在渲染 Jinja2 模板:

from jinja2 import Template, FileSystemLoader, Environment

# Loading a template from a file (template.html)
file_loader = FileSystemLoader('.')
env = Environment(loader=file_loader)
template = env.get_template('template.html')

# Rendering the template with data
output = template.render(name='Alice')

# Output the rendered template
print(output)

渲染後的 Jinja2 模板的輸出將是一個 HTML 文件,其中佔位符將被渲染期間傳遞的實際資料替換:

<!DOCTYPE html>
<html>
<head>
    <title>Hello, Alice!</title>
</head>
<body>
    <h1>Hello, Alice!</h1>
    <p>Welcome to our site.</p>
</body>
</html>

高階 Jinja2 功能

Jinja2 支援各種高階功能,例如迴圈、條件和自定義過濾器,使其成為建立複雜模板的強大工具。

模板繼承

Jinja2 支援模板繼承,允許您建立一個包含通用元素(如頁首、頁尾、導航欄)的基本模板,並在子模板中擴充套件或覆蓋特定塊。這有助於在大型專案中重用程式碼並提高可維護性。

示例

這個名為“base.html”的 HTML 模板檔案使用 Jinja2 模板語法定義了網頁的基本結構。

它包含塊“{% block title %}" 和“{% block content %}",可以在派生模板中覆蓋這些塊,以分別自定義頁面的標題和主要內容:

<!-- base.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}Default Title{% endblock %}</title>
</head>
<body>
    {% block content %}{% endblock %}
</body>
</html>

以下 Jinja2 模板檔案“child.html”擴充套件了“base.html”模板,覆蓋了 title 塊將其設定為“Child Page”,並覆蓋了 content 塊以包含一個帶有文字“Child Page Content”的<h1> 標題。

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

{% block title %}Child Page{% endblock %}

{% block content %}
<h1>Child Page Content</h1>
{% endblock %}

迴圈

Jinja2 允許您使用 {% for %} 迴圈迭代列表或其他可迭代物件。以下是如何使用迴圈在 HTML 中生成無序列表 (<ul>) 的示例:

<ul>
{% for item in items %}
    <li>{{ item }}</li>
{% endfor %}
</ul>

條件語句

Jinja2 中的條件語句 ({% if %}{% else %}) 用於根據條件控制模板的流程。以下是一個示例,其中“Jinja2”檢查使用者是否存在,如果存在則顯示個性化問候;否則,它會提示登入:

{% if user %}
    <p>Welcome, {{ user }}!</p>
{% else %}
    <p>Please log in.</p>
{% endif %}

自定義過濾器

Jinja2 中的自定義過濾器用於定義您自己的過濾器,以便在模板中顯示資料之前操作資料。

在以下示例中,在 Jinja2 中定義了一個自定義過濾器 reverse 來反轉字串“hello”,在模板中應用時會得到“olleh”:

# Define a custom filter function
def reverse_string(s):
    return s[::-1]

# Register the filter with the Jinja2 environment
env.filters['reverse'] = reverse_string

然後,您可以在模板中將“reverse”過濾器應用於任何字串:

{{ "hello" | reverse }}

以下是獲得的輸出:

olleh
廣告