问题 在Mako中将字符串标记为安全


我正在使用带有Mako模板的Pylons,我想避免一直打字:

${ h.some_function_that_outputs_html() | n }

我想以某种方式标记函数,或者将变量标记为安全(您可以在Django中执行此操作),因此我不必一直使用pipe-en。有任何想法吗?


2796
2017-12-01 10:36


起源



答案:


我刚刚发现,如果你放了一个 HTML 在你的类中的方法,然后Mako将调用该方法并输出它在模板中返回的任何内容。

所以我做了:

def __html__(self):
    return unicode(self)

这基本上就是h.literal的作用。


10
2017-12-07 13:05



这必须进入由“返回”的“类” h.some_function_that_outputs_html() 我假设。 - Felix


答案:


我刚刚发现,如果你放了一个 HTML 在你的类中的方法,然后Mako将调用该方法并输出它在模板中返回的任何内容。

所以我做了:

def __html__(self):
    return unicode(self)

这基本上就是h.literal的作用。


10
2017-12-07 13:05



这必须进入由“返回”的“类” h.some_function_that_outputs_html() 我假设。 - Felix


根据 关于过滤的mako文档,您可以设置创建新模板时在模板中应用的默认过滤器 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 doc),还没有尝试过)


3
2017-12-01 20:41



谢谢,这对我有用 - disc0dancer
只是通知人们使用第一个解决方案(从default_filters中删除转义) - 你必须清除缓存(rm -r data / templates / *)才能看到它正常工作(我只是想知道什么是错的)。 - zefciu