我正在使用python with pylons
我想在mako文件中显示textarea中保存的数据,新行格式正确显示
这是最好的方式吗?
> ${c.info['about_me'].replace("\n", "<br />") | n}
答案 0 :(得分: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/>
来标记安全字符串并知道要逃避哪些字符串。我们只将{{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']),如果你和很多设计师一起工作,就不会让他们发疯。