在mako文件中将\ n转换为<br/>

时间:2010-02-18 00:33:50

标签: python pylons mako

我正在使用python with pylons

我想在mako文件中显示textarea中保存的数据,新行格式正确显示

这是最好的方式吗?

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

6 个答案:

答案 0 :(得分:5)

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

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

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

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

此解决方案使用markupsafemako使用<br/>来标记安全字符串并知道要逃避哪些字符串。我们只将{{1}}标记为安全,而不是字符串的其余部分,因此如果需要,它将被转义。

答案 1 :(得分: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.

原始字符串保持不变。那么......这是最好的方式吗?

问问自己:它有用吗?它是否能够在不诉诸可怕的黑客的情况下快速完成工作?那么是的,这是最好的方式。

答案 2 :(得分:2)

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

提交为\r\n

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

尝试这样做会起作用: -

${c.info['about_me'] | n}

答案 5 :(得分: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。或者我在helper中做一个简单的包装器函数,这样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']),如果你和很多设计师一起工作,就不会让他们发疯。