我正在使用 Python 3.9.13、Flask 1.1.2、Jinja2 2.11.3 和 MarkupSafe 1.1.1 运行 Flask 应用程序,并使用 Redis (3.5.3) 作为会话存储。当我用
创建一条 Flash 消息时flash(Markup('<b>This</b> is a <b>WARNING</b>.'),category="warning")
Flask 将显示(如预期)
这是一个警告。
选择与警告闪烁消息相关的背景颜色。
我正在尝试将应用程序移动到 Python 3.12.4、Flask 3.0.3 和 MarkupSafe 2.1.5(Jinja2 ia 为 3.1.4,但 Flask 直接使用 MarkupSafe,而不是从 Jinja2 导入它,所以我不认为这相关,Redis 是 5.0.8)。但是,当我尝试重定向到设置为闪现消息的页面时,应用程序会默默失败并出现内部服务器错误。深入研究 Flask,我可以看到它在处理 process_response 并尝试保存会话时抛出异常
Encoding objects of type Markup is unsupported
https://github.com/pallets/flask/blob/main/src/flask/ app.py#L1301,这似乎是由 _flashes 列表中的 Markup 对象引起的。如果将 Markup 转换为字符串,不会失败,但消息显示为:
<b>This</b> is a <b>WARNING</b>.
(它确实以正确的背景颜色显示。)有没有办法在当前的 Flask 中格式化 Flash 消息,就像我们以前在早期版本中所做的那样,或者我做错了什么?
(1) 使用纯字符串调用 flash:
flash('<b>This</b> is a <b>WARNING</b>.',category="warning")
(2) 将 jinja 模板更改为:
<div class="container-fluid">
{%- with messages = get_flashed_messages(with_categories=True) %}
{%- if messages %}
<div class="row">
<div class="col-md-13">
{{utils.flashed_messages(messages)}}
</div>
</div>
{%- endif %}
{%- endwith %}
</div>
到
{%- with messages = get_flashed_messages(with_categories=True) %}
{%- if messages %}
{% for category, message in messages %}
<div class="container-fluid flashed-messages" style="margin-top:1em;padding-left:5em;padding-right:5em">
<div class="row">
<div class="col-md-13">
<div class="{{ category }}">{{ message | safe }}</div>
</div>
</div>
</div>
{% endfor %}
{%- endif %}
{%- endwith %}
和(3) 确保我的
static/css/app.css
具有代码使用的适当类(仅使用
error
、
message
、
warning
和
success
):
.error {
color: white;
background-color: red
}
.message {
color: black;
background-color: lightblue
}
.warning {
color: black;
background-color: orange
}
.success {
color: white;
background-color: green
}
这给了我带有正确背景颜色的闪现消息。谢谢你,@Detlef!