Python Pyramid 和 Chameleon 模板语言转义 HTML
我对变色龙的标签有点搞不懂。我是Django的用户,但决定给我的计算机科学课程同学和自己介绍一下Pyramid,因为我觉得更轻量级的框架学习起来会更简单。
现在我发现,使用${}标签时,它会把我想输出的任何HTML标签都转义掉。在Django中,有一种方法可以指定一个变量是“安全的”,不需要被转义。
我该如何在Pyramid / Chameleon中做到这一点呢?
2 个回答
16
Chameleon 还支持 ${structure: markup} 这种写法。
11
Chameleon是基于Zope页面模板库的,所以如果你觉得Chameleon的文档不够详细,可以去看看ZPT的文档。
总的来说,有两种主要的方法可以做到这一点。如果你使用tal:replace或tal:content标签属性来渲染内容,你可以使用“结构”。具体做法是在字符串开头加上structure
,然后加一个空格,最后是你想渲染的模板变量的名字。下面是一个示例:
s = '''
<html>
<head>
</head>
<body>
<div tal:content="structure t">
</div>
</body>
</html>
'''
from chameleon import PageTemplate
pt = PageTemplate(s)
print pt(t='<p>Hi!</p>')
如果你不想使用tal:replace或tal:content这些功能,你需要把你的字符串放在一个Chameleon渲染器不会尝试转义的对象里(也就是说,这个对象有一个__html__
方法,返回字符串应该是什么)。通常,这意味着你需要创建一个'Literal'类,下面是示例:
a = '''
<html>
<head>
</head>
<body>
<div>
${t}
</div>
</body>
</html>
'''
from chameleon import PageTemplate
pt = PageTemplate(a)
class Literal(object):
def __init__(self, s):
self.s =s
def __html__(self):
return self.s
print pt(t=Literal('<p>Hi!</p>'))