3 Python 模板库比较

你的下一个 Python 项目是否需要模板引擎来自动生成 HTML?这里有一些选项。
1081 位读者喜欢这篇文章。
Getting started with 4 practical Python libraries: Prompt Toolkit, Click, Pygments, and Fuzzy Finder

门诺派教会美国档案馆。由 Opensource.com 修改。CC BY-SA 4.0

在我的日常工作中,我花大量时间将来自各种来源的数据整理成人类可读的信息。虽然很多时候这只是采用电子表格或某种图表或其他数据可视化的形式,但有时以书面形式呈现数据更有意义。

 

但我最讨厌的事情是复制和粘贴。如果你正在将数据从其来源移动到标准化模板,你也不应该复制和粘贴。这很容易出错,而且说实话,这不是对你时间的良好利用。

 

因此,对于我定期发送的任何遵循通用模式的信息,我倾向于找到某种方法来至少自动化其中的一部分。也许这涉及到在电子表格中创建一些公式、一个快速的 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 或包含我所有页面列表的其他数据文件中生成它?我是否可以轻松地为我撰写的每个主题创建此页面的副本?我是否可以以编程方式更改每个页面的文本或标题或标题?这就是模板引擎可以发挥作用的地方。

有很多不同的选项可供选择,今天我将与你分享三个,排名不分先后:MakoJinja2Genshi

Mako

Mako 是一个在 MIT 许可证下发布的 Python 模板工具,专为快速性能而设计(与 Jinja2 非常相似)。Reddit 已使用 Mako 为其网页提供支持,并且它也是 Pyramid 和 Pylons 等 Web 框架的默认模板语言。它也相当简单易用;你只需几行代码即可设计模板。它同时支持 Python 2.x 和 3.x,是一个功能强大且功能丰富的工具,并具有 良好的文档,我认为这是必须的。功能包括过滤器、继承、可调用块和内置缓存系统,这对于大型或复杂的 Web 项目可能很重要。

Jinja2

Jinja2 是另一个快速且功能齐全的选项,在 BSD 许可证下可用于 Python 2.x 和 3.x。从功能角度来看,Jinja2 与 Mako 有很多重叠,因此对于新手来说,你在这两者之间的选择可能取决于你更喜欢哪种格式样式。Jinja2 还会将你的模板编译为字节码,并具有 HTML 转义、沙盒、模板继承以及对模板部分进行沙盒处理的功能。它的用户包括 Mozilla、SourceForge、NPR、Instagram 等,并且还具有 强大的文档。与 Mako 不同,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 Wiki 上的更全面的列表,以获取更多值得考虑的项目。

标签
Jason Baker
前 Red Hatter。现在是顾问和有抱负的企业家。地图爱好者、创客和开源桌面和自托管软件的热情安装者。

6 条评论

Tempy

我通过 Flask 使用 jinja2。永远记住 KISS 原则!

对于我完成的大多数类似的事情,我倾向于手动从 Python 生成 HTML。

我将 jinja / Django 模板用于大多数 Web 渲染用例 - 但是,对于认真自下而上构建 HTML,请尝试 LXML ElementBuilder

感谢 Jason,这篇文章对这些模板库进行了有益且公正的比较。这对我真的很有帮助!

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.