web-dev-qa-db-fra.com

Comment afficher le contenu HTML à travers des messages en flacon?

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.

16
naga4ce

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>
32
the911s

Utilisez le filtre safe :

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

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%}

1
Seth IK