3 个你可能(大概)永远不应该使用的 Python 模板语言

Python 积累了许多模板语言,包括这三个非常适合愚人节的语言。
97 位读者喜欢这篇文章。
Hands on a keyboard with a Python book

WOCinTech Chat。由 Opensource.com 修改。CC BY-SA 4.0

当为编写 Python Web 应用程序选择模板语言时,有大量可靠的解决方案。

Jinja2Genshi 和 Mako。甚至还有像 Chameleon 这样的解决方案,它们虽然比较老,但仍然受到 Pyramid 框架的推荐。

Python 已经存在很长时间了。在这段时间里,在其系统的深处,它积累了一些几乎被遗忘的模板语言,非常值得研究。

就像桉树顶上可爱的考拉,在它们的生态位中快乐地生活,有时又像它们一样危险,这些就是鲜为人知,更少有人应该使用的模板语言。

3. string.Template

你是否曾想过,“如何获得一个没有功能,但也不需要 pip install 任何东西的模板语言?” Python 标准库满足你的需求。虽然它没有循环或条件语句,但 string.Template 类是一个最小化的模板语言。

使用它非常简单。

>>> import string
>>> greeting = string.Template("Hello, $name, good $time!")
>>> greeting.substitute(name="OpenSource.com", time="afternoon")
'Hello, OpenSource.com, good afternoon!'

2. twisted.web.template

你送给拥有一切的库什么礼物?

当然,它不是一个模板语言,因为它已经有一个了。在 twisted.web.template 中嵌套着两个模板语言。其中一个是基于 XML 的,并且有一个 很棒的教程

但还有另一个,它是基于使用 Python 作为领域特定语言来生成 HTML 文档的。

它基于两个原语:twisted.web.template.tags,它包含标签对象,以及 twisted.web.template.flattenString,它将渲染它们。因为它属于 Twisted 的一部分,所以它内置了对高效渲染异步结果的支持。

这个例子将渲染一个简单的页面

async def render(reactor):
    my_title = "A Fun page"
    things = ["one", "two", "red", "blue"]
    template = tags.html(
            tags.head(
                tags.title(my_title),
            ),
            tags.body(
                tags.h1(my_title),
                tags.ul(
                    [tags.li(thing) for thing in things],
                ),
                tags.p(
                    task.deferLater(reactor, 3, lambda: "Hello "),
                    task.deferLater(reactor, 3, lambda: "world!"),
                )
            )
    )
    res = await flattenString(None, template)
    res = res.decode('utf-8')
    with open("hello.html", 'w') as fpout:
        fpout.write(res)

模板是常规的 Python 代码,它使用 tags.<TAGNAME> 来指示层次结构。它原生支持字符串作为可渲染对象,所以任何字符串都可以。

要渲染它,你唯一需要做的就是添加一个前导

from twisted.internet import task, defer
from twisted.web.template import tags, flattenString

def main(reactor):
    return defer.ensureDeferred(render(reactor))

和一个尾声来运行整个程序

task.react(main)

只需 秒(而不是 秒),它将渲染一个漂亮的 HTML 页面。在现实生活中,这些 deferLater 可以是,例如,对 HTTP API 的调用:它们将被并行发送和处理,而无需付出任何努力。我建议你阅读关于 Twisted 的更好用途。但即便如此,这仍然有效。

1. Quixote

你可能会说,“但是 Python 并没有针对作为 HTML 输出的领域特定语言进行优化。” 如果,不是满足于原生的 Python,而是有一种语言可以 转译 成 Python,但在定义模板方面做得更好呢?如果你愿意,可以称之为“Python 模板语言”(PTL)。

编写自己的语言有时被认为是梦想家的项目,适合那些与风车作战的人。当 Quixote 的创建者(可在 PyPI 上找到)决定这样做时,他们并非没有意识到其中的讽刺意味。

以下代码将渲染一个与上面使用 Twisted 完成的模板等效的模板。警告:以下代码不是有效的 Python 代码

import time

def render [html] ():
    my_title = "A Fun page"
    things = ["one", "two", "red", "blue"]
    "<html><head><title>"
    my_title
    "</head></title><body><h1>"
    my_title
    "</h1>"
    "<ul>"
    for thing in things:
        "<li>"
        thing
        "</li>"
    "<p>"
    time.sleep(3)
    (lambda: "Hello ")()
    time.sleep(3)
    (lambda: "world!")()
    "</p>"
    "</body></html>"

def write():
    result = render()
    with open("hello.html", 'w') as fpout:
        fpout.write(str(result))

但是,如果你将其放在一个名为 template.ptl 的文件中,你可以使其可导入到 Quixote 并写出模板的渲染版本

>>> from quixote import enable_ptl
>>> enable_ptl()
>>> import template
>>> template.write()

Quixote 安装了一个导入钩子,它将导致 PTL 文件转译成 Python。请注意,这次渲染需要 秒,而不是 秒;你不再获得免费的异步性。

Python 中有如此多的模板

Python 库的历史悠久而曲折,其中一些库可以用或多或少相似的方式实现相同的结果(例如,Python 包管理)。

在这个愚人节,我希望你喜欢探索在 Python 中创建模板的 可能 三种方式。相反,我建议你从 这些库之一 开始,了解你 应该 如何创建模板。

你还有其他深奥的模板方法吗?在下面的评论中分享吧!

接下来阅读
标签
Moshe sitting down, head slightly to the side. His t-shirt has Guardians of the Galaxy silhoutes against a background of sound visualization bars.
Moshe 自 1998 年以来一直参与 Linux 社区,并在 Linux “安装聚会” 中提供帮助。他自 1999 年以来一直编写 Python 程序,并为核心 Python 解释器做出了贡献。Moshe 在 DevOps/SRE 这些术语出现之前就一直是 DevOps/SRE,他非常关心软件可靠性、构建可重复性以及其他此类事情。

评论已关闭。

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.