如何更换' ' 在 Flask 应用程序中带有 '<br>' 的字符串?

问题描述 投票:0回答:4

我一直在尝试修改一个字符串,然后将其传递到 Flask 中的 HTML 页面(替换出现的 ' ' 和 '
'),但我使用的典型方法由于某种原因不起作用。

finalstring = textstring.replace('\n', '<br>')
return render_template('my-form-result.html', emailresponse = finalstring)

这应该可行,但由于某种原因,没有任何内容被替换。我怎样才能让它发挥作用?谢谢!

python python-3.x flask
4个回答
2
投票

在 HTML 中替换

\n
的更好方法是 使用 CSS 样式

你的

replace()
没问题。调试您的代码并确保
\n
之前有
replace()

为了能够查看 HTML 中的换行符,您应该在模板中使用

safe
过滤器。但请注意,您可能会受到 XSS 攻击。要解决此问题,您应该在替换
\n
字符之前转义字符串。这是代码:

from flask import escape

...
...
    safe_html = str(escape(text)).replace('\n', '<br/>')
    return render_template('[HTML file].html', safe_html=safe_html)

---------
#in the template:
   <span> {{ safe_html | safe }} </span>

如果在替换之前不使用

str()
调用,那么
<br/>
也会被转义。因为
escape()
的返回值不是
string


1
投票

免责声明:我从未使用过 Flask,我只是查了一下它并希望它能实现你想做的事情。

因此,在模板中的某个位置

my-form-result.html
,您应该找到包含以下内容的行:

{{ emailresponse }}

您可以将其替换为:

{% for line in emailresponse.split('\n') %}
{{ line }}
<br />
{% endfor %}

在每个换行符后添加

br


0
投票

您的

replace()
代码是正确的。 确保对模板中的 HTML 进行转义:

{{ emailresponse|safe }}

要诊断,请尝试以下操作:

finalstring = textstring.replace('\n', '<br>')
print(finalstring)
return render_template('my-form-result.html', emailresponse = finalstring)

另外,向我们展示网页中的源代码,看看模板中实际渲染了什么


0
投票

解决方案是使用

nl2br
Jinja 过滤器

from markupsafe import Markup, escape

def nl2br(value):
    """Securely replace all newline characters '\n' by HTML '<br>' break tags."""

    safe_value = str(escape(value))
    formatted_value = safe_value.replace("\n", "<br>")

    return Markup(formatted_value)
<p> {{ yourinputstring | nl2br }} </p>

为了解释,您希望将输入字符串中的换行符

\n
替换为输出模板中的 HTML 换行符标记
<br>

问题在于,出于安全原因(特别是为了防止

XSS 漏洞
),Jinja 会转义特殊字符,例如
<
>。因此,如果您只是将
\n
字符替换为
<br>
标签,它们将被转义并且不起作用。

<p> {{ yourinputstring | safe }} </p> <!-- DON'T DO THIS -->

您可以要求模板中的 Jinja 不要使用

safe
过滤器转义字符,但这会使您容易受到 XSS 攻击(尤其是当输入来自用户时)。强烈建议不要这种做法。

我不知道为什么这没有在本地实现,但唯一的解决方案是使用自定义过滤器。

MarkupSafe
是Jinja和Flask使用的模块,所以它应该已经安装了。


如果您使用 Flask,您的代码将如下所示:

from flask import Flask, render_template
from markupsafe import Markup, escape

server = Flask(__name__)

@server.template_filter()
def nl2br(value):
    """Securely replace all newline characters '\\n' by HTML '<br>' break tags."""

    safe_value = str(escape(value))
    formatted_value = safe_value.replace("\n", "<br>")

    return Markup(formatted_value)

@server.route("/index.html")
def index():
    input_string = "hello, world!\n"
    dangerous_input = "<script>alert('XSS');</script>"
    
    return render_template("index.html", input_1=input_string, input_2=dangerous_input)

if __name__ == "__main__": 
    server.run(debug=True, port=8080)

使用

index.html
模板为:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Jinja custom filter for newline characters</title>
</head>
<body>
        <p>{{ input_1 | nl2br }}<p>
        <p>{{ input_2 | nl2br }}</p>
</body>
</html>

渲染的 HTML 看起来像这样,有效地将

\n
转换为
<br>
,同时防止 XSS 攻击:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Jinja custom filter for newline characters</title>
</head>
<body>
    <p>hello, world!<br><p>
    <p>&lt;script&gt;alert(&#39;XSS&#39;);&lt;/script&gt;</p>
</body>
</html>

顺便说一句,有人绝对应该建议 Jinja 维护者在本地实现这个,因为它似乎是非常基本且普遍有用的东西。

© www.soinside.com 2019 - 2024. All rights reserved.