2012-01-23 13 views

Odpowiedz

11

Możesz napisać własny filtr. scrubber library jest całkiem niezły w oczyszczaniu HTML. Filtr będzie musiał owinąć zwracany ciąg w jinja2.Markup, aby szablon nie uciekł z niego ponownie.

Edit: a przykładowy kod

import jinja2 
import scrubber 

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

jinja_env.filters['sanitize_html'] = sanitize_html 
11

będziemy chcieli przeprowadzić analizę danych wejściowych o poddaniu przy użyciu białej listy podejście - istnieje kilka dobrych przykładów in this question i viable options tam.

Gdy już to zrobisz, możesz zaznaczyć wszystkie zmienne, które zawierają kod HTML, który nie powinien być uciekł z filtrem safe:

{{comment|safe}} 
6

Biblioteka Bleach może zrobić bardzo dobrze.

Na przykład, zakładając, że zmienna „jinja_env” jest w zakresie:

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 

Następnie w szablonie może masz coś takiego:

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

Można również użyć wymagalne (zamiast lista) w atrybutach, pozwalająca na dokładniejsze sprawdzanie atrybutów (np. sprawdzanie, czy src udostępnia poprawny adres URL). Dokumentacja pokazuje an example.