如何在 Flask 中标记 Flash 消息?

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

我正在使用 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 消息,就像我们以前在早期版本中所做的那样,或者我做错了什么?

python flask flash markup
1个回答
0
投票
所以@Detlef 的建议是有效的。我必须做三件事:

(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!

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