11

我正在使用带有 Mako 模板的 Pylons,我想避免一直输入这个:

${ h.some_function_that_outputs_html() | n }

我想以某种方式将函数或变量标记为安全的(你可以在 Django 中做到这一点),这样我就不必一直使用管道。有任何想法吗?

4

2 回答 2

10

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

所以我做了:

def __html__(self):
    return unicode(self)

这基本上就是 h.literal 所做的。

于 2009-12-07T13:05:10.050 回答
3

根据关于过滤的 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如果您想单独保留原始函数,则为调用结果的该函数提供一个助手。(或者我猜你也可以通过“Filtering def”来调用它(参见上面相同的 Mako 文档),还没有尝试过)

于 2009-12-01T20:41:03.797 回答