Jinja2 escape tout HTML sauf img, b, etc
Jinja2 échappe automatiquement à toutes les balises HTML, mais je ne veux pas échapper à certaines balises (comme img
,b
, et de quelques autres). Comment puis-je le faire?
3 réponses
Vous pouvez écrire votre propre filtre. laveur bibliothèque est assez bon dans le nettoyage de HTML. Le filtre devra envelopper la chaîne retournée dans jinja2.Markup
donc le modèle ne va pas le ré-échapper.
Edit: un exemple de code
import jinja2
import scrubber
def sanitize_html(text):
return jinja2.Markup(scrubber.Scrubber().scrub(text))
jinja_env.filters['sanitize_html'] = sanitize_html
vous voudrez analyser les commentaires sur la soumission en utilisant une approche de liste blanche - il y a plusieurs bons exemples dans cette question et options viables là-bas.
une fois que vous avez fait cela, vous pouvez marquer toutes les variables qui contiennent du HTML qui ne devraient pas être échappées avec le safe
filtre:
{{comment|safe}}
eau de Javel bibliothèque peuvent faire très bien.
Par exemple, en supposant que la variable "jinja_env' est dans la portée:
from bleach import clean
from markupsafe import Markup
def do_clean(text, **kw):
"""Perform clean and return a Markup object to mark the string as safe.
This prevents Jinja from re-escaping the result."""
return Markup(clean(text, **kw))
jinja_env.filters['clean'] = do_clean
alors dans un template vous pourriez avoir quelque chose comme:
<p>{{ my_variable|clean(tags=['img', 'b', 'i', 'em', 'strong'], attributes={'img': ['src', 'alt', 'title', 'width', 'height']}) }}</p>
vous pouvez également utiliser un callable (au lieu d'une liste) dans les attributs, permettant une validation plus complète des attributs (par exemple en vérifiant que src fournit une URL valide). La Documentation montre un exemple.