Je comprends que flash()
ne prend que des chaînes et l’affiche dans la page redirigée. J'essaie d'envoyer du HTML via 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>
Mais il affiche en tant que chaîne <h1>Voila! Platform is ready to used</h1>
est-il possible de surmonter ce problème.
Utiliser {{message|safe}}
fonctionnera, mais ouvrira également la porte à un attaquant pour qu'il injecte du code HTML ou Javascript malveillant dans votre page, également connu comme une attaque XSS. Plus d'infos ici si vous êtes intéressé.
Dans la mesure du possible, une approche plus sécurisée consiste à envelopper votre chaîne dans un objet Markup avant de la transmettre au modèle:
Code Python:
from flask import Markup
message = Markup("<h1>Voila! Platform is ready to used</h1>")
flash(message)
return render_template('output.html')
Modèle Jinja2:
<div class="flashes">
{% for message in get_flashed_messages() %}
{{ message }}
{% endfor %}
</div>
Utilisez le filtre safe
:
<div class="flashes">
{% for message in get_flashed_messages()%}
{{ message|safe }}
{% endfor %}
</div>
Dans les cas où vous voudrez peut-être contrôler le css appliqué en fonction du statut du message (Success | Error), le code suivant peut être utile
{% 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%}