2012-01-23 8 views

risposta

11

È possibile scrivere il proprio filtro. Lo scrubber library è abbastanza efficace per la pulizia dell'HTML. Il filtro avrà bisogno di avvolgere la stringa restituita in jinja2.Markup in modo che il modello non lo elimini di nuovo.

Edit: un esempio di codice

import jinja2 
import scrubber 

def sanitize_html(text): 
    return jinja2.Markup(scrubber.Scrubber().scrub(text)) 

jinja_env.filters['sanitize_html'] = sanitize_html 
11

ti consigliamo di analizzare l'input su presentazione utilizzando un approccio lista bianca - ci sono molti buoni esempi in this question e viable options là fuori.

Una volta fatto questo, è possibile contrassegnare tutte le variabili che conterranno HTML che non deve essere sfuggito con il filtro safe:

{{comment|safe}} 
6

La biblioteca Bleach può fare molto bene.

Per esempio, supponendo che il 'jinja_env' variabile è portata:

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 

Poi, in un modello che si potrebbe avere qualcosa di simile:

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

È inoltre possibile utilizzare un callable (invece di una lista) negli attributi, consentendo una convalida più approfondita degli attributi (ad es. verificando che src fornisca un URL valido). La documentazione mostra an example.

Problemi correlati