Jinja2 automatycznie wymyka się wszystkim znacznikom HTML, ale nie chcę uciec od tagów (takich jak img
, b
i kilka innych). Jak mogę to zrobić?Jinja2 ucieka wszystkim HTML, ale img, b, itp.
Odpowiedz
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
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}}
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.