265 votes

Passer du HTML au modèle à l'aide de Flask/Jinja2

Je construis un admin pour Flask et SQLAlchemy, et je veux passer le HTML pour les différentes entrées à ma vue en utilisant render_template. Le cadre de modélisation semble échapper automatiquement au HTML, de sorte que tous les caractères <"'> sont convertis en entités HTML. Comment puis-je désactiver cela pour que le HTML s'affiche correctement ?

516voto

iamgopal Points 1575

Pour désactiver l'autoescaping lors du rendu d'une valeur, utilisez le filtre |safe.

{{ something|safe }}

Ne le faites que sur les données de confiance, car le rendu de données non fiables sans fuite est une vulnérabilité de type scripts intersites.

147voto

Armin Ronacher Points 16894

MarkupSafe fournit le comportement d'autoéchapage de Jinja. Vous pouvez importer Markup et l'utiliser pour déclarer une valeur HTML à l'abri du code :

from markupsafe import Markup
value = Markup('<strong>The HTML String</strong>')

Passez-le aux modèles et vous n'avez pas à utiliser le filtre |safe dessus.

46voto

daronwolff Points 1758

À partir de la section Jinja docs HTML Échappement :

Lorsque l'échappement automatique est activé, tout est échappé par défaut, à l'exception des valeurs explicitement marquées comme sûres. Ceux-ci peuvent être marqués par l'application ou dans le modèle en utilisant le filtre |safe.

Exemple :

 <div class="info">
   {{data.email_content|safe}}
 </div>

18voto

NieDzejkob Points 424

Lorsque vous avez beaucoup de variables qui n'ont pas besoin d'être échappées, vous pouvez utiliser un bloc de substitutionautoescape

{% autoescape false %}
{{ something }}
{{ something_else }}
<b>{{ something_important }}</b>
{% endautoescape %}

4voto

sharvey Points 1698

Je déteste quand vous trouvez la réponse juste après avoir posté une question. Quoi qu'il en soit, pour référence, vous pouvez utiliser

app.jinja_env.autoescape = False

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X