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

163

Je construis un administrateur pour Flask et SQLAlchemy, et je souhaite transmettre le HTML pour les différentes entrées à ma vue en utilisant render_template. Le cadre de création de modèles semble échapper automatiquement au code HTML, donc tous les <"'> sont convertis en entités HTML. Comment puis-je désactiver cela pour que le HTML s'affiche correctement?

Sharvey
la source

Réponses:

344

le moyen idéal est de

{{ something|safe }}

que de désactiver complètement l'échappement automatique.

iamgopal
la source
2
salut @Armin Ronacher, pourriez-vous s'il vous plaît expliquer plus et donner un exemple? Merci.
Samoth
Je veux dire, par exemple, j'ai un fichier appelé userHome.html, et je voudrais l'utiliser return render_template('userHome.html'), mais il ne s'affiche pas correctement et tous se transforment en entités html dans ma console chrome.
Samoth
Dans l' transétiquette, cela doit être utilisé comme{% trans something=something|safe %}A {{something}} B{% endtrans %}
Kangur
1
Il convient de mentionner que vous devez faire attention à éviter les vulnérabilités de Cross-Site Scripting lorsque vous faites cela, car vous désactivez les protections intégrées de la bibliothèque de modèles contre elle.
Harry Cutts
108

Vous pouvez également le déclarer HTML à l'abri du code:

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

Ensuite, transmettez cette valeur aux modèles et ils n'y sont pas obligés |safe.

Armin Ronacher
la source
4
Le balisage est une classe Jinja2, oui. Il implémente une interface commune supportée par de nombreuses bibliothèques python (malheureusement pas Django). Vous pouvez également utiliser le package sécurisé de balisage qui implémente le même objet: pypi.python.org/pypi/MarkupSafe
Armin Ronacher
il existe dans jinja2
Giovanni G. PY
23

À partir de la section docs jinja échappement HTML :

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>
Daronwolff
la source
5

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

{% autoescape off %}
{{ something }}
{{ something_else }}
<b>{{ something_important }}</b>
{% endautoescape %}
NieDzejkob
la source
1

Certaines personnes semblent désactiver l' échappement automatique, ce qui comporte des risques de sécurité pour manipuler l'affichage de la chaîne.

Si vous souhaitez uniquement insérer des sauts de ligne dans une chaîne et convertir les sauts de ligne en <br />, vous pouvez prendre une macro jinja comme:

{% macro linebreaks_for_string( the_string ) -%}
{% if the_string %}
{% for line in the_string.split('\n') %}
<br />
{{ line }}
{% endfor %}
{% else %}
{{ the_string }}
{% endif %}
{%- endmacro %}

et dans votre modèle, appelez cela avec

{{ linebreaks_for_string( my_string_in_a_variable ) }}
Helge
la source