有没有办法从烧瓶中带有'\n'字符的字符串中添加新行?

oll*_*ien 17 python flask

当我遇到'\n'字符的奇怪问题时,我正在玩烧瓶.它似乎没有在我的浏览器中产生影响,我尝试放在
那里,但它没有工作,任何想法?

from flask import Flask
from flask import render_template
test=Flask(__name__)
@test.route('/')
def root():
    str='yay\nsuper'
    return str
test.run(debug=True)
Run Code Online (Sandbox Code Playgroud)

Sam*_*ady 27

所以事实证明,flask autoescapes html标签.因此添加<br>标记只是在屏幕上呈现它们而不是实际创建换行符.

有两种解决方法:

  1. 将文本分解为数组

    text = text.split('\n')
    
    Run Code Online (Sandbox Code Playgroud)

    然后在模板中使用for循环:

    {% for para in text %}
        <p>{{para}}</p>
    {% endfor %}
    
    Run Code Online (Sandbox Code Playgroud)
  2. 禁用自动转义

    首先,我们更换\n<br>使用替换:

    text = text.replace('\n', '<br>')
    
    Run Code Online (Sandbox Code Playgroud)

    然后我们通过围绕我们需要它的块来禁用自动转换

    {% autoescape false %}
        {{text}}
    {% endautoescape %}
    
    Run Code Online (Sandbox Code Playgroud)

    但是,我们不鼓励这样做:

    无论何时执行此操作,请对此块中使用的变量非常谨慎.

我认为第一个版本避免了第二个版本中存在的漏洞,同时仍然很容易理解.

  • {% 自动转义错误 %} !这正是我要找的,谢谢。 (2认同)

Dav*_*son 15

在特定情况下,换行仅对HTML呈现有影响.您需要使用表示换行符的HTML标记,例如<br/>.

def root():
    str='yay<br/>super'
    return str
Run Code Online (Sandbox Code Playgroud)

  • 不,实际上是为我打印了&lt;br/&gt;屏幕截图:http://grab.by/fOTO编辑:H1是对HTML标签的测试,但与br相同 (3认同)
  • 由于这被标记为正确答案...@ollien 正在经历标准的 Jinja2 行为。Samarth 的回答解决了这个问题。 (2认同)

Zep*_*Zep 9

如果有人像我一样最终在这里,并且出于安全原因不想使用 {% autoescape false %},也不想使用在某些情况下可能不方便的文本,我在这里找到了一个很好的选择:

from flask import Markup
value = Markup('First line.<br>Second line.<br>')
Run Code Online (Sandbox Code Playgroud)

然后在 jinja 模板中:

{{ value }}
Run Code Online (Sandbox Code Playgroud)


Nic*_*ert 7

我参加聚会迟到了,但这是我的解决方案。
HTML 有一个<pre>标签在这种情况下很有用。

<pre>{{ your_text }}</pre>
Run Code Online (Sandbox Code Playgroud)

该标签告诉浏览器不要自动调整间距和换行符。
要了解有关此标签的更多信息,请查看指南。