2012-01-23 12 views

Respuesta

11

Puede escribir su propio filtro. El scrubber library es bastante bueno para limpiar HTML. El filtro deberá envolver la cadena devuelta en jinja2.Markup para que la plantilla no vuelva a escapar.

Editar: 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 
11

Querrá se analiza la entrada en la presentación utilizando un enfoque de lista blanca - hay varios buenos ejemplos in this question y viable options por ahí.

Una vez que haya hecho eso, puede marcar ninguna de las variables que van a contener HTML que no se debe escapó con el filtro safe:

{{comment|safe}} 
6

La biblioteca Bleach puede hacer muy bien.

Por ejemplo, suponiendo que el 'jinja_env' variable es en su alcance:

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 que podría tener algo como:

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

También puede utilizar un exigible (en lugar de una lista) en los atributos, lo que permite una validación más completa de los atributos (por ejemplo, verificar que src proporciona una URL válida). La documentación muestra an example.