当为编写 Python Web 应用程序选择模板语言时,有大量可靠的解决方案。
有 Jinja2、Genshi 和 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 中创建模板的 可能 三种方式。相反,我建议你从 这些库之一 开始,了解你 应该 如何创建模板。
你还有其他深奥的模板方法吗?在下面的评论中分享吧!
评论已关闭。