Как отображать содержимое html через фляжные сообщения?

Я понимаю, что flash() принимает только строку и показывает, что на перенаправленной странице. Я пытаюсь отправить html через flash

message = "<h1>Voila! Platform is ready to used</h1>"
flash(message)
return render_template('output.html')

output.html

<div class="flashes">
  {% for message in get_flashed_messages()%}
    {{ message }}
  {% endfor %}
</div>

Но он отображается как строка <h1>Voila! Platform is ready to used</h1>, есть ли способ преодолеть это.

Ответы

Ответ 1

Там, где это возможно, безопасный подход - заключить вашу строку в объект разметки перед передачей ее в шаблон:

Код Python:

from flask import Markup

message = Markup("<h1>Voila! Platform is ready to used</h1>")
flash(message)
return render_template('output.html')

Jinja2 Шаблон:

<div class="flashes">
  {% for message in get_flashed_messages() %}
    {{ message }}
  {% endfor %}
</div>

Использование {{message|safe}} будет работать, но также позволит злоумышленнику внедрить вредоносный HTML или Javascript на вашу страницу, также известную как атака XSS. Больше информации здесь, если вы заинтересованы.

Ответ 2

Используйте safe фильтр:

<div class="flashes">
  {% for message in get_flashed_messages()%}
    {{ message|safe }}
  {% endfor %}
</div>

Ответ 3

В случаях, когда вы можете контролировать применение css в зависимости от состояния сообщения (Success | Error), может оказаться полезным следующий код

{% for category, msg in get_flashed_messages(with_categories=true) %}

    <div class="alert {{ category }} alert-dismissible" role="alert">
                            <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
                           {{ msg|safe }}
    </div>

{% endfor%}