天天看點

Jinja2:使用Python進行模闆渲染的藝術

作者:程式員梓羽同學
Jinja2:使用Python進行模闆渲染的藝術

Flask 中的 Jinja2 是什麼

前言

jinja2 是 Flask 作者開發的一個模闆系統,起初是仿 Django 模闆的一個模闆引擎,為 Flask 提供模闆支援,由于其靈活,快速和安全等優點被廣泛使用。當我們開發 Web 應用程式時,通常需要将資料動态地渲染到 HTML 模闆中,而 Python jinja2 模版技術正是為此而生的。

要了解jinja2,那麼需要先了解模闆的概念。模闆在 Python 的web開發中廣泛使用,它能夠有效的将業務邏輯和頁面邏輯分開,使代碼可讀性增強、并且更加容易了解和維護。

模闆簡單來說就是一個其中包含 占位變量 表示 動态 部分的檔案,模闆檔案在經過動态指派後,傳回給使用者。

Jinja2:使用Python進行模闆渲染的藝術

模闆渲染流程

Jinja2簡介

Jinja2 是一個流行的 Python 模闆引擎,它可以幫助我們将資料渲染到各種格式的文檔中,如 HTML、XML、Markdown 等。Jinja2 具有以下幾個特性:

  • 簡單而靈活的文法
  • 支援模闆繼承和包含
  • 支援過濾器和控制結構
  • 可以自定義全局變量

安裝

使用 pip 指令可以很容易地安裝 Jinja2:

pip install Jinja2           

基本文法

Jinja2 的基本文法與 Python 很相似,包括變量、表達式、控制結構等。下面是一些示例:

<!-- 變量 -->
<p>Hello, {{ name }}!</p>

<!-- 表達式 -->
{% if count > 10 %}
  <p>There are too many items.</p>
{% else %}
  <p>There are {{ count }} items.</p>
{% endif %}

<!-- 循環 -->
<ul>
{% for item in items %}
  <li>{{ item }}</li>
{% endfor %}
</ul>           

在這個示例中,我們使用了變量、表達式和循環結構來渲染模闆。變量使用 {{ ... }} 文法,表達式使用 {% ... %} 文法,循環結構使用 {% for ... in ... %} ... {% endfor %} 文法。

模闆繼承和包含

模闆繼承

Jinja2中最強大的部分就是模闆繼承。模闆繼承允許我們建立一個基本(骨架/Base)檔案,其他模版檔案從該骨架檔案繼承,然後針對需要的地方進行修改。

Jinja2的Base檔案中,利用 block 關鍵字表示其包含的内容可以進行修改。可以幫助我們避免重複的代碼和布局。

下面是一個示例:

<!-- base.html -->
<html>
<head>
  <title>{% block title %}{% endblock %}</title>
</head>
<body>
  {% block content %}
  {% endblock %}
</body>
</html>

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

{% block title %}My Page{% endblock %}

{% block content %}
  <h1>Welcome to my page!</h1>
{% endblock %}           

在這個示例中,我們定義了一個基礎模闆 base.html,它包含了頁面的基本結構和布局。我們還定義了一個子模闆 page.html,它繼承了 base.html,并覆寫了其中的标題和内容塊。

模闆包含

除了模闆繼承之外,Jinja2 還支援模闆包含,可以将重複的代碼抽象為一個單獨的模闆,然後在其他模闆中引用它。

這可以幫助我們避免重複的代碼和布局。下面是一個示例:

<!-- header.html -->
<header>
  <h1>My Website</h1>
  <nav>
    <ul>
      <li><a href="/">Home</a></li>
      <li><a href="/about">About</a></li>
      <li><a href="/contact">Contact</a></li>
    </ul>
  </nav>
</header>

<!-- page.html -->
{% include "header.html" %}

<main>
  <h1>Welcome to my page!</h1>
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
</main>

{% include "footer.html" %}           

在這個示例中,我們定義了一個頭部模闆 header.html,它包含了網站的标題和導航菜單。然後我們在頁面模闆 page.html 中引用了頭部模闆和尾部模闆 footer.html,以建構完整的頁面。

使用模闆包含可以幫助我們更好地組織代碼和布局,使代碼更易于維護和擴充。

過濾器和控制結構

變量可以通過 過濾器 進行修改,過濾器可以了解為是jinja2裡面的内置函數和字元串處理函數。

常用的過濾器有:

過濾器名稱 說明
safe 渲染時值不轉義
capitialize 把值的首字母轉換成大寫,其他子母轉換為小寫
lower 把值轉換成小寫形式
upper 把值轉換成大寫形式
title 把值中每個單詞的首字母都轉換成大寫
trim 把值的首尾空格去掉
striptags 渲染之前把值中所有的HTML标簽都删掉
join 拼接多個值為字元串
replace 替換字元串的值
round 預設對數字進行四舍五入,也可以用參數進行控制
int 把值轉換成整型

除了上述特性,Jinja2 還有其他一些有用的功能,下面介紹其中幾個:

安全過濾器

在模闆中渲染使用者提供的資料時,安全性是一個非常重要的問題。Jinja2 提供了一個安全過濾器,可以幫助我們過濾掉一些危險的 HTML 标簽和屬性,以防止 XSS 攻擊等安全問題。

安全過濾器示例:

{{ user_input|safe }}           

循環控制結構

除了基本的循環結構之外,Jinja2 還提供了一些進階的循環控制結構,比如 break、continue 和 loop.index0 等。這些控制結構可以幫助我們更好地控制循環過程。

在for循環中,jinja2提供了一些特殊的變量,用以來擷取目前的周遊狀态:

變量 描述
loop.index 目前疊代的索引(從1開始)
loop.index0 目前疊代的索引(從0開始)
loop.first 是否是第一次疊代,傳回bool
loop.last 是否是最後一次疊代,傳回bool
loop.length 序列中的項目數量
loop.revindex 到循環結束的次數(從1開始)
loop.revindex0 到循環結束的次數(從0開始)

循環控制結構示例:

{% for item in items %}
  {% if item == 'stop' %}
    {% break %}
  {% elif item == 'skip' %}
    {% continue %}
  {% endif %}
  <li>{{ loop.index0 }}: {{ item }}</li>
{% endfor %}           

自定義全局變量

除了在模闆中定義變量之外,Jinja2 還支援在 Python 代碼中定義全局變量,然後在模闆中使用。這可以幫助我們更好地組織代碼和資料。

自定義全局變量示例:

from jinja2 import Environment

# 定義全局變量
my_var = 'Hello, world!'

# 建立模闆引擎
env = Environment()

# 添加全局變量
env.globals['my_var'] = my_var

# 渲染模闆
template = env.from_string('<p>{{ my_var }}</p>')
result = template.render()
print(result)           

在這個示例中,我們定義了一個全局變量 my_var,然後将它添加到模闆引擎的全局變量中。最後,我們使用模闆引擎渲染了一個模闆,并輸出了結果。

使用Jinja2進行渲染

jinja2子產品中有一個名為Enviroment的類,這個類的執行個體用于存儲配置和全局對象,然後從檔案系統或其他位置中加載模闆。

基本使用方法

大多數應用都在初始化的時候建立一個Environment對象,并用它加載模闆。Environment支援兩種加載方式:

  • PackageLoader:包加載器
  • FileSystemLoader:檔案系統加載器

PackageLoader

參數:

  • PackageLoader()的兩個參數為:python包的名稱,以及模闆目錄名稱。
  • get_template():擷取模闆目錄下的某個具體檔案。
  • render():接受變量,對模闆進行渲染

使用包加載器來加載文檔的最簡單的方式如下:

from jinja2 import PackageLoader,Environment
# 建立一個包加載器對象
env = Environment(loader=PackageLoader('項目xx包目錄','templates'))
# 擷取一個模闆檔案
template = env.get_template('bast.html')    
# 渲染
template.render(name='daxin',age=18)              

FileSystemLoader

檔案系統加載器,不需要模闆檔案存在某個Python包下,可以直接通路系統中的檔案

總結

Jinja2 是一個強大而靈活的 Python 模闆引擎,它可以幫助我們将資料渲染到各種格式的文檔中。它具有簡單而靈活的文法、支援模闆繼承和包含、支援過濾器和控制結構等特性。如果你需要在 Python 中使用模闆引擎,Jinja2 是一個不錯的選擇。

當然,除了可以在 Python Web 開發過程中使用Jinja2模版,如果大家在做自動化腳本(自動化用例)時也可以使用它,可以根據相關自動化資訊(比如:用例編号、步驟、斷言等)批量生成不同自動化測試用例(腳本)。總之,Jinja2 的使用場景可以用于多種需求下,今天的文章就介紹到這裡了,感謝大家的閱讀。