2

$user.text在 mako 模板中<br>输出一些 UGC(

但是,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}

<br>...生成带有转义标签的相同 html :

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

我能够找到允许<br>标签通过而不转义的唯一方法是完全删除“h”过滤器,如下所示:

${user.text | n,nl2br}

但这违背了对user.text场地进行消毒的目的。

如何让“h”过滤器触发然后添加<br>标签?

我错过了缓冲区的东西吗?

4

2 回答 2

3

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

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

解决方案是告诉markupsafe<br />受信任的:

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

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

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

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

于 2013-02-10T05:46:07.610 回答
0

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

由于h标签在过滤器顺序中触发得太晚,我创建了自己的版本并通过调用__str__.

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

然后,这允许我首先通过 HTML 转义然后通过nl2br过滤器传递用户的文本,而无需将<br>标签转换为 HTML 实体。

${user.text | early_html_escape,nl2br }

希望对某人有所帮助。

于 2013-01-20T17:41:13.523 回答