【问题标题】:Comparing web.py's Templator and Jinja2: strengths and weaknesses比较 web.py 的 Templator 和 Jinja2:优势和劣势
【发布时间】:2011-11-06 20:44:51
【问题描述】:

我正在向现有软件添加一个简单的网络界面; web.py 正好适合这项工作,这就是我正在使用的。现在我正在研究使用什么模板引擎,并得出了两种选择:要么使用 web.py 自己的 Templator,要么使用 Jinja2。

我已经在应用程序中工作,并且我正在编写一些非常简单的模板来探索它们。我必须说我发现 Templator 更容易阅读,这可能是因为我是一名程序员而不是网页设计师(谁可能会觉得 Jinja 更容易?)。

虽然我现在只生成(不合规的;)丑陋的 HTML 页面,但我还将使用模板引擎来生成电子邮件和旧的纯文本文件。

对于任何实际用途来说,这两种软件都“足够快”,我想问一下广泛使用其中一种或两种软件的人,它们在易用性、代码清洁度、灵活性、等等。

【问题讨论】:

    标签: python templates web.py jinja2


    【解决方案1】:

    快速查看Templator(我从未使用过)并将其与Jinja2(我已广泛使用)进行比较,我会说两者非常相似......但Templator是更接近于Mako 而不是 Jinja。

    Mako 和 Jinja 都支持:

    • 模板继承(您可以拥有所有页面都继承自的布局)
    • 空白控制

    虽然 Mako 和 Templator 都支持:

    • 在您的模板中嵌入“安全”的 Python。

    三个都支持:

    • 添加到模板上下文(函数、对象、变量、作品)
    • 定义函数以在模板中封装可重用的功能片段(Jinja 称它们为“宏”。)
    • 条件和循环
    • 设置和获取局部变量。
    • 表达式评估
    • 缓存已编译的字节码以加快未来的执行速度。

    Templator 支持我不相信 Jinja 或 Mako 会做的奇怪事情:

    • 从模板代码中设置已编译模板对象的属性。 (坦率地说,实际上使用该功能似乎是错误的做法。您的模板可以确定的任何标志都需要根据上下文传入的内容进行设置,应该已经 设置为您的应用程序代码。)

    Jinja 获取模板代码并将它们编译为 Python 字节码,但它对所有内容都这样做,而不是将字符串传递给 Python 解释器以使用 safe_eval。通过这样做,Jinja2 理论上对模板级别的某些类型的攻击免疫(但是当您从模板收到恶意输入时,您通常会遇到更大的问题)。

    至于其余部分,这完全取决于您对语法的偏好。

    【讨论】:

    • Jinja2 提供了一个 [sandbox][jinja.pocoo.org/docs/sandbox/] 允许执行不受信任的代码。
    • @Daslch - 绝对正确!我区分 Jinja 和 Mako 的原因是(我相信)在 Sandbox 正常模式下,Jinja2 不会将 any 模板代码视为 Python 代码 - 每个Jinja 模板中的构造是 Jinja 构造 - 甚至 如果它看起来像 Python 语句或表达式。另一方面,Mako 和 Templator 实际上将他们确定为“安全”的字符串直接传递给 Python 解释器。
    【解决方案2】:

    在 Templetor 中对我来说困难的是模板继承。而不是存在的 blocks 的简单概念,例如在 Jinja2 中,您必须在应用程序代码中选择一次基本模板,然后在实际模板中进行奇怪的属性设置,同时在基本模板中访问它。如果您需要多个像页面正文这样的“大”块,您仍然会遇到问题。

    真正的块要优雅得多,而且 Templetor 的“真正” Python 的灵活性并不是真正必要的,虽然它可能不安全。

    【讨论】:

      猜你喜欢
      • 2011-02-08
      • 2019-12-23
      • 2013-01-08
      • 1970-01-01
      • 2011-03-25
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多