Python 正在将\n转换为<;br>;在mako文件中

Python 正在将\n转换为<;br>;在mako文件中,python,pylons,mako,Python,Pylons,Mako,我正在使用python和挂架 我想在mako文件中显示文本区域中保存的数据,新的行格式正确,便于显示 这是最好的方法吗 > ${c.info['about_me'].replace("\n", "<br />") | n} ${c.info['about_me'].替换(“\n”,“”)|n} 在我看来,这似乎非常合适 请注意,replace()返回原始字符串的副本,并且不会在适当的位置对其进行修改。因此,由于此替换仅用于显示目的,因此应该可以正常工作 下面是一个小的可视示例

我正在使用python和挂架

我想在mako文件中显示文本区域中保存的数据,新的行格式正确,便于显示

这是最好的方法吗

> ${c.info['about_me'].replace("\n", "<br />") | n}
${c.info['about_me'].替换(“\n”,“
”)|n}
在我看来,这似乎非常合适

请注意,
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.
>s=“”这是我的段落。
... 
…我喜欢段落。
... """
>>>打印s.replace('\n','
')) 这是我的段落。

我喜欢段落。
>>>印刷品 这是我的段落。 我喜欢段落。
原始字符串保持不变。所以这是最好的方法吗


问问自己:它有效吗?它能在不使用可怕的黑客的情况下迅速完成任务吗?那么是的,这是最好的方法。

请注意,
中的换行符应根据


为了安全起见,请尝试
s.replace('\r\n','
')
然后
s.replace('\n','
')
这对我来说似乎很危险,因为它打印整个字符串而不转义,这将允许呈现任意标记。在打印之前,请确保使用lxml或类似工具清理用户输入。请注意,lxml将封装在HTML标记中,它无法处理与此不同的事情,因此请准备手动删除该标记或调整CSS以适应它。

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

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

${text.replace('\n',markupsafe.Markup('
'))}
或者,如果您想多次使用它:

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

${text|br}

此解决方案使用
markupsafe
,它被
mako
用来标记安全字符串并知道要转义的字符串。我们只将

标记为安全的,而不是字符串的其余部分,因此如果需要,它将被转义。

还可以调用一个简单的帮助函数,它将正确格式化和调整文本大小,以替换
标记(请参阅)

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

from webhelpers.html.converters import textilize
然后在你的mako文件中简单地说

h.textilize( c.info['about_me'], santize=True)
santize=True只是意味着它将确保任何其他讨厌的代码都被转义,这样用户就不能入侵你的网站,因为默认值为False。或者,我在helpers中做一个简单的包装函数,这样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']),如果您与许多设计师合作,这可以防止他们发疯。

试试这个方法,它会起作用:-

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

我会选择

”。join(s.splitlines())
@cookiecaper:我相信这个解决方案解决了您提到的安全问题,而不必求助于lxml进行清理。可能太晚了,无法发表评论,但第一个案例在我的设置Mako 1.0.1和MarkupSafe 0.23中不起作用。如果我使用字符串替换text.replace('\n',markupsafe.Markup('
'),它的作用与text.replace('\n','
')完全相同,只是将其转换为unicode。不过,另一种方法是有效的。下面可能有用:
${markupsafe.escape(text).replace('\n',markupsafe.Markup('
'))}