我一直在尝试修改一个字符串,然后将其传递到 Flask 中的 HTML 页面(替换出现的 '
' 和 '
'),但我使用的典型方法由于某种原因不起作用。
finalstring = textstring.replace('\n', '<br>')
return render_template('my-form-result.html', emailresponse = finalstring)
这应该可行,但由于某种原因,没有任何内容被替换。我怎样才能让它发挥作用?谢谢!
在 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
。
免责声明:我从未使用过 Flask,我只是查了一下它并希望它能实现你想做的事情。
因此,在模板中的某个位置
my-form-result.html
,您应该找到包含以下内容的行:
{{ emailresponse }}
您可以将其替换为:
{% for line in emailresponse.split('\n') %}
{{ line }}
<br />
{% endfor %}
在每个换行符后添加
br
您的
replace()
代码是正确的。 确保对模板中的 HTML 进行转义:
{{ emailresponse|safe }}
要诊断,请尝试以下操作:
finalstring = textstring.replace('\n', '<br>')
print(finalstring)
return render_template('my-form-result.html', emailresponse = finalstring)
另外,向我们展示网页中的源代码,看看模板中实际渲染了什么
解决方案是使用
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><script>alert('XSS');</script></p>
</body>
</html>
顺便说一句,有人绝对应该建议 Jinja 维护者在本地实现这个,因为它似乎是非常基本且普遍有用的东西。