【问题标题】:Mark string as safe in Mako在 Mako 中将字符串标记为安全
【发布时间】:2010-12-21 23:20:57
【问题描述】:

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

${ h.some_function_that_outputs_html() | n }

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

【问题讨论】:

    标签: python pylons mako


    【解决方案1】:

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

    所以我做到了:

    def __html__(self):
        return unicode(self)
    

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

    【讨论】:

    • 这必须进入我假设的h.some_function_that_outputs_html()返回的“类”。
    【解决方案2】:

    根据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 的变量,您可以只使用 @987654331 @ 没有任何转义。

    如果您在从模板内部调用某个函数时想要相同的效果,则该函数需要返回这样的文字,或者为该函数提供一个助手,如果您想离开,则该函数在结果上调用 h.literal原来的功能而已。 (或者我猜你也可以通过“Filtering def”来调用它(参见上面相同的 Mako 文档),还没有尝试过)

    【讨论】:

    • 只是对使用第一个解决方案的人的通知(从 default_filters 中删除转义) - 您必须清除缓存(rm -r data/templates/*)才能看到它工作(我只是想知道什么是错误)。
    猜你喜欢
    • 2023-03-10
    • 2010-11-19
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 2015-01-16
    • 2021-03-30
    相关资源
    最近更新 更多