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?

12
demandé sur Mu Mind 2012-01-23 22:28:29

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
11
répondu Alex Morega 2012-01-23 20:12:30

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}}
11
répondu Sean Vieira 2017-05-23 12:25:06

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.

6
répondu David 2014-11-25 05:47:02