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?

Réponses:


344

le moyen idéal est de

{{ something|safe }}

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


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.


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>

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

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 ) }}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.