Flask 中的 Jinja2 是什麼
前言
jinja2 是 Flask 作者開發的一個模闆系統,起初是仿 Django 模闆的一個模闆引擎,為 Flask 提供模闆支援,由于其靈活,快速和安全等優點被廣泛使用。當我們開發 Web 應用程式時,通常需要将資料動态地渲染到 HTML 模闆中,而 Python jinja2 模版技術正是為此而生的。
要了解jinja2,那麼需要先了解模闆的概念。模闆在 Python 的web開發中廣泛使用,它能夠有效的将業務邏輯和頁面邏輯分開,使代碼可讀性增強、并且更加容易了解和維護。
模闆簡單來說就是一個其中包含 占位變量 表示 動态 部分的檔案,模闆檔案在經過動态指派後,傳回給使用者。
模闆渲染流程
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 的使用場景可以用于多種需求下,今天的文章就介紹到這裡了,感謝大家的閱讀。