4

我正在使用 python 和 pylons

我想在 mako 文件中显示来自 textarea 的保存数据,并且新行的格式正确以便显示

这是最好的方法吗?

> ${c.info['about_me'].replace("\n", "<br />") | n}
4

6 回答 6

5

您的解决方案的问题在于您绕过了字符串转义,这可能导致安全问题。这是我的解决方案:

<%! import markupsafe %>
${text.replace('\n', markupsafe.Markup('<br />'))}

或者,如果您想多次使用它:

<%!
    import markupsafe
    def br(text):
        return text.replace('\n', markupsafe.Markup('<br />'))
%>
${text | br }

此解决方案使用markupsafe, 用于mako标记安全字符串并知道要转义哪个字符串。我们只标记<br/>为安全的,而不是字符串的其余部分,因此如果需要,它将被转义。

于 2012-09-27T13:38:47.367 回答
2

在我看来,这是非常合适的。

请注意,它会replace()返回原始字符串的副本,并且不会对其进行就地修改。因此,由于此替换仅用于显示目的,它应该可以正常工作。

这是一个小的视觉示例:

>>> s = """This is my paragraph.
... 
... I like paragraphs.
... """
>>> print s.replace('\n', '<br />')
This is my paragraph.<br /><br />I like paragraphs.<br />
>>> print s
This is my paragraph.

I like paragraphs.

原始字符串保持不变。所以...这是最好的方法吗?

问问自己:它有效吗?它是否在不使用可怕的黑客攻击的情况下快速完成了工作?那么是的,这是最好的方法。

于 2010-02-18T00:55:11.550 回答
2

<textarea>请注意,应\r\n根据http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4提交 s中的换行符

为了安全起见,请s.replace('\r\n', '<br />')尝试s.replace('\n', '<br />')

于 2010-02-18T01:01:10.230 回答
1

试试这个它会工作: -

${c.info['about_me'] | n}
于 2014-01-09T09:42:22.753 回答
1

这对我来说似乎很危险,因为它打印整个字符串而不转义,这将允许呈现任意标签。确保在打印之前使用 lxml 或类似方法清理用户的输入。请注意,lxml 将包装在 HTML 标记中,它无法处理与此不同的内容,因此请准备好手动删除它或调整您的 CSS 以适应。

于 2011-09-11T22:13:45.863 回答
0

还有一个可以调用的简单帮助函数,它将正确格式化和清理文本,替换
标签的 \n (参见http://sluggo.scrapping.cc/python/WebHelpers/modules/html/converters.html)。

在 helpers.py 中添加以下内容:

from webhelpers.html.converters import textilize

然后在你的 mako 文件中简单地说

h.textilize( c.info['about_me'], santize=True)

santize=True 只是意味着它将确保任何其他讨厌的代码都被转义,因此用户无法破解您的网站,因为默认值为 False。或者,我在助手中做了一个简单的包装函数,以便 santize=True 始终默认为 True 即

from webhelpers.html.converters import textilize as unsafe_textilize

def textilize( value, santize=True):
    return unsafe_textilize( value, santize )

这样你就可以从你的 mako 文件中调用 h.textilize( c.info['about_me'] ) ,如果你和很多设计师一起工作,他们就不会发疯。

于 2012-10-16T21:17:29.660 回答