你的下一個 Python 專案需要一個模板引擎來自動生成 HTML 嗎?這有幾種選擇。
在我的日常工作中,我花費大量的時間將各種來源的資料轉化為可讀的資訊。雖然很多時候這只是電子表格或某種型別的圖表或其他資料視覺化的形式,但也有其他時候,將資料以書面形式呈現是有意義的。
但我的頭疼地方就是複製和貼上。如果你要將資料從源頭移動到標準化模板,則不應該複製和貼上。這很容易出錯,說實話,這會浪費你的時間。
因此,對於我定期傳送的任何遵循一個共同的模式的資訊,我傾向於找到某種方法來自動化至少一部分資訊。也許這涉及到在電子表格中建立一些公式,一個快速 shell 指令碼或其他解決方案,以便使用從外部源提取的資訊自動填充模板。
但最近,我一直在探索 Python 模板來完成從其他資料集建立報告和圖表的大部分工作。
Python 模板引擎非常強大。我的簡化報告建立的使用案例僅僅觸及了它的皮毛。許多開發人員正在利用這些工具來構建完整的 web 應用程式和內容管理系統。但是,你並不需要有一個複雜的 web 應用程式才能使用 Python 模板工具。
為什麼選擇模板?
每個模板工具都不甚相同,你應該閱讀文件以瞭解其確切的用法。但讓我們建立一個假設的例子。假設我想建立一個簡短的頁面,列出我最近編寫的所有 Python 主題。就像這樣:
<html>
<head>
<title>My Python articles</title>
</head>
<body>
<p>These are some of the things I have written about Python:</p>
<ul>
<li>Python GUIs</li>
<li>Python IDEs</li>
<li>Python web scrapers</li>
</ul>
</body>
</html>
當它僅僅是這三個專案時,維護它是很簡單的。但是當我想新增第四個、第五個或第六十七個時會發生什麼?我可以從包含我所有頁面列表的 CSV 檔案或其他資料檔案生成它,而不是手動編碼此頁面嗎?我可以輕鬆地為我寫的每個主題建立重複內容嗎?我可以以程式設計方式更改每個頁面上的文字標題嗎?這就是模板引擎可以發揮作用的地方。
有許多不同的選擇,今天我將與你其中分享三個,順序不分先後:Mako、 Jinja2 和 Genshi。
Mako
Mako 是以 MIT 許可證釋出的 Python 模板工具,專為快速展現而設計的(與 Jinja2 不同)。Reddit 已經使用 Mako 來展現他們的網頁,它同時也是 Pyramid 和 Pylons 等 web 框架的預設模板語言。它相當簡單且易於使用。你可以使用幾行程式碼來設計模板;支援 Python 2.x 和 3.x,它是一個功能強大且功能豐富的工具,具有良好的文件,這一點我認為是必須的。其功能包括過濾器、繼承、可呼叫塊和內建快取系統,這些系統可以被大型或複雜的 web 專案匯入。
Jinja2
Jinja2 是另一個快速且功能全面的選項,可用於 Python 2.x 和 3.x,遵循 BSD 許可證。Jinja2 從功能角度與 Mako 有很多重疊,因此對於新手來說,你在兩者之間的選擇可能會歸結為你喜歡的格式化風格。Jinja2 還將模板編譯為位元組碼,並具有 HTML 轉義、沙盒、模板繼承和模板沙盒部分的功能。其使用者包括 Mozilla、 SourceForge、 NPR、 Instagram 等,並且還具有強大的文件。與 Mako 在模板內部使用 Python 邏輯不同的是,Jinja2 使用自己的語法。
Genshi
Genshi 是我會提到的第三個選擇。它是一個 XML 工具,具有強大的模板元件,所以如果你使用的資料已經是 XML 格式,或者你需要使用網頁以外的格式,Genshi 可能成為你的一個很好的解決方案。HTML 基本上是一種 XML(好吧,不是精確的,但這超出了本文的範圍,有點賣弄學問了),因此格式化它們非常相似。由於我通常使用的很多資料都是 XML 或其他型別的資料,因此我非常喜歡使用我可以用於多種事物的工具。
發行版目前僅支援 Python 2.x,儘管 Python 3 支援存在於主幹中,但我提醒你,它看起來並沒有得到有效的開發。Genshi 遵循 BSD 許可證提供。
示例
因此,在上面的假設示例中,我不會每次寫新主題時都更新 HTML 檔案,而是透過程式設計方式對其進行更新。我可以建立一個模板,如下所示:
<html>
<head>
<title>My Python articles</title>
</head>
<body>
<p>These are some of the things I have written about Python:</p>
<ul>
%for topic in topics:
<li>${topic}</li>
%endfor
</ul>
</body>
</html>
然後我可以使用我的模板庫來迭代每個主題,比如使用 Mako,像這樣:
from mako.template import Template
mytemplate = Template(filename='template.txt')
print(mytemplate.render(topics=("Python GUIs","Python IDEs","Python web scrapers")))
當然,在現實世界的用法中,我不會將這些內容手動地列在變數中,而是將它們從外部資料來源(如資料庫或 API)中提取出來。
這些不是僅有的 Python 模板引擎。如果你正在開始建立一個將大量使用模板的新專案,那麼你考慮的可能不僅僅是這三種選擇。在 Python 維基上檢視更全面的列表,以獲得更多值得考慮的專案。
via: https://opensource.com/resources/python/template-libraries
作者:Jason Baker 選題:lujun9972 譯者:MjSeven 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出