我正在使用 python 和 pylons
我想在 mako 文件中显示来自 textarea 的保存数据,并且新行的格式正确以便显示
这是最好的方法吗?
> ${c.info['about_me'].replace("\n", "<br />") | n}
您的解决方案的问题在于您绕过了字符串转义,这可能导致安全问题。这是我的解决方案:
<%! 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/>
为安全的,而不是字符串的其余部分,因此如果需要,它将被转义。
在我看来,这是非常合适的。
请注意,它会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.
原始字符串保持不变。所以...这是最好的方法吗?
问问自己:它有效吗?它是否在不使用可怕的黑客攻击的情况下快速完成了工作?那么是的,这是最好的方法。
<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 />')
。
试试这个它会工作: -
${c.info['about_me'] | n}
这对我来说似乎很危险,因为它打印整个字符串而不转义,这将允许呈现任意标签。确保在打印之前使用 lxml 或类似方法清理用户的输入。请注意,lxml 将包装在 HTML 标记中,它无法处理与此不同的内容,因此请准备好手动删除它或调整您的 CSS 以适应。
还有一个可以调用的简单帮助函数,它将正确格式化和清理文本,替换
标签的 \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'] ) ,如果你和很多设计师一起工作,他们就不会发疯。