Python Pyramid 和 Chameleon 模板语言转义 HTML

4 投票
2 回答
3872 浏览
提问于 2025-04-16 13:56

我对变色龙的标签有点搞不懂。我是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>'))

撰写回答