繁体   English   中英

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

[英]Mark string as safe in Mako

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

${ h.some_function_that_outputs_html() | n }

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

我刚刚发现如果你在你的类中放入一个html方法,那么Mako将只调用该方法并输出它在模板中返回的任何内容。

所以我做了:

def __html__(self):
    return unicode(self)

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

根据关于过滤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),还没有尝试过)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM