【问题标题】:Mako template filter orderingMako 模板过滤器排序
【发布时间】:2013-01-08 13:04:14
【问题描述】:

当在 mako 模板中输出一些 UGC ($user.text) 时,我想使用 mako 过滤器 'h' 来清理内容,然后添加一些 <br> 标记来代替换行符,所以会有一些格式化。

但是,mako 似乎忽略了我应用“h”过滤器的顺序,现在我的 <br> 标签被转义而不是呈现。

这是我的添加过滤器:

<%
def nl2br(str):
    return str.replace("\n", "<br/>")
%>

这是我的测试字符串:

hello,

My name is

James

以下带有过滤器的 mako 标签:

${user.text | n,h,nl2br}
${user.text | n,nl2br,h}

... 生成相同的 html 并转义了 &lt;br&gt; 标签:

hello,
&lt;br/&gt;
&lt;br/&gt;My name is
&lt;br/&gt;
&lt;br/&gt;James

我能够找到让&lt;br&gt; 标签通过而不转义的唯一方法是完全删除“h”过滤器,如下所示:

${user.text | n,nl2br}

但这违背了清理user.text字段的目的。

如何让“h”过滤器触发,然后添加 &lt;br&gt; 标签?

我是否缺少缓冲区的内容?

【问题讨论】:

    标签: mako


    【解决方案1】:

    您看到的行为是由于 Markup.replace 假定替换字符串不安全:

    >>> from markupsafe import Markup, escape >>> e = escape(">x\ny") >>> e 标记(u'>x\ny') >>> e.replace("\n", "
    ") 标记(u'>x
    y')

    解决方案是告诉markupsafe &lt;br /&gt; 是可信的:

    >>> e.replace("\n", Markup("
    ")) 标记(u'>x
    y')

    所以你的nl2br 过滤器应该是:

    from markupsafe import Markup
    def nl2br(s):
        return s.replace("\n", Markup("<br />"))
    

    然后${user.text|h,nl2br} 应该会按预期工作。

    【讨论】:

      【解决方案2】:

      我无法弄清楚上面的订单是怎么回事,所以如果你有答案,请在此处发布。相反,我使用了一种解决方法...

      由于h 标记在过滤器顺序中触发得太晚,我创建了自己的版本并通过调用__str__ 强制它返回干净的HTML。

      def early_html_escape(string):
          """Run markupsafe escaping and force the result to string."""
          import markupsafe
          return markupsafe.escape(string).__str__()
      

      这让我可以先通过 HTML 转义然后通过 nl2br 过滤器传递用户的文本,而不会将 &lt;br&gt; 标记转换为 HTML 实体。

      ${user.text | early_html_escape,nl2br }
      

      希望对某人有所帮助。

      【讨论】:

        猜你喜欢
        • 2016-05-09
        • 2018-04-29
        • 2013-02-09
        • 1970-01-01
        • 2013-11-27
        • 1970-01-01
        • 2013-09-01
        • 2018-02-19
        • 2014-06-27
        相关资源
        最近更新 更多