我正在使用带有Mako模板的Pylons,我想避免一直打字:
${ h.some_function_that_outputs_html() | n }
我想以某种方式标记函数,或者将变量标记为安全(您可以在Django中执行此操作),因此我不必一直使用pipe-en。有任何想法吗?
答案 0 :(得分:10)
我刚刚发现,如果你在你的类中加入 html 方法,那么Mako将只调用该方法并输出它在模板中返回的任何内容。
所以我做了:
def __html__(self):
return unicode(self)
这基本上就是h.literal的作用。
答案 1 :(得分:3)
根据mako docs about filtering,您可以设置在创建新Template
以及TemplateLookup
时在模板中应用的默认过滤器(在这种情况下,这将适用于对于它查找的所有模板的默认值,使用default_filters
参数。
Pylons将此参数与TemplateLookup
一起使用,以在config/environment.py
文件中设置项目的默认值:
# Create the Mako TemplateLookup, with the default auto-escaping
config['pylons.app_globals'].mako_lookup = TemplateLookup(
directories=paths['templates'],
error_handler=handle_mako_error,
module_directory=os.path.join(app_conf['cache_dir'], 'templates'),
input_encoding='utf-8', default_filters=['escape'],
imports=['from webhelpers.html import escape'])
这就是你默认获得转义的原因(当你自己使用Mako时就不是这种情况)。因此,您可以在配置文件中全局更改它,或者不依赖于标准查找。请注意,您当然应该明确地使用过滤器来逃避那些需要转义的东西。
您还可以使用Pylons助手h.literal
传递“标记为安全”的字符串,例如,如果您将h.literal('This will <b>not</b> be escaped')
传递给模板,例如名为spam
的变量,你可以在没有任何转义的情况下使用${spam}
。
如果从模板内部调用某个函数时需要相同的效果,则此函数需要返回这样的文字,或者为该函数提供帮助,如果需要,可以在结果上调用h.literal
单独留下原始功能。 (或者我猜你也可以通过“过滤def”来调用它(参见上面的相同Mako文档),还没有尝试过)