Jinja2 escapa todo HTML pero img, b, etc

Jinja2 automáticamente escapa todas las tags HTML, pero no quiero escapar algunas tags (como img , b , y algunas otras). ¿Cómo puedo hacerlo?

Puedes escribir tu propio filtro. La biblioteca de scrubber es bastante buena para limpiar HTML. El filtro deberá envolver la cadena devuelta en jinja2.Markup para que la plantilla no la vuelva a escapar.

Edición: un ejemplo de código

 import jinja2 import scrubber def sanitize_html(text): return jinja2.Markup(scrubber.Scrubber().scrub(text)) jinja_env.filters['sanitize_html'] = sanitize_html 

Querrá analizar la información sobre el envío utilizando un enfoque de lista blanca: hay varios buenos ejemplos en esta pregunta y opciones viables .

Una vez que haya hecho eso, puede marcar cualquier variable que contenga HTML que no deba escaparse con el filtro safe :

 {{comment|safe}} 

La biblioteca Bleach puede hacerlo muy bien.

Por ejemplo, asumiendo que la variable ‘jinja_env’ está en el scope:

 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 

Luego en una plantilla puedes tener algo como:

 

{{ my_variable|clean(tags=['img', 'b', 'i', 'em', 'strong'], attributes={'img': ['src', 'alt', 'title', 'width', 'height']}) }}

También puede usar un llamable (en lugar de una lista) en los atributos, lo que permite una validación más completa de los atributos (p. Ej., Comprobar que src proporciona una URL válida). La documentación muestra un ejemplo .