python 模板语言
当需要使用一种模板语言来编写Python Web应用程序时,有很多健壮的解决方案。
有Jinja2 , Genshi和Mako 。 甚至还有诸如Chameleon之类的解决方案,虽然有些陈旧,但仍受Pyramid框架推荐。
Python已经存在了很长时间。 在那个时候,它深陷系统的角落,积累了一些几乎被遗忘的模板语言,非常值得一试。
就像桉树上的可爱树袋熊,在生态环境中感到高兴,有时工作起来一样危险一样,这些是很少有人听说过的模板语言,甚至应该使用的语言也更少。
3. string.Template
您是否曾经想过:“我该如何获得一种没有功能但又不需要安装任何东西的模板语言?” 涵盖了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代码。<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.吉x德
您会说:“但是,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创建模板。 相反,我建议从这些库之一开始,以了解应使用 哪些模板。
您还有另一种神秘的模板制作方法吗? 在下面的评论中分享!
翻译自: https://opensource.com/article/20/4/python-templating-languages
python 模板语言