Как отображать содержимое 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%}