Jinja2 автоматически избегает всех HTML-тегов, но я не хочу избегать некоторых тегов (например, img
, b
и некоторых других). Как я могу это сделать?
Jinja2 избегает всех HTML, но img, b и т.д.
Ответ 1
Вы можете написать свой собственный фильтр. библиотека скрубберов довольно хороша при очистке HTML. Фильтр должен будет обернуть возвращаемую строку в jinja2.Markup
, чтобы шаблон не удалял ее.
Изменить: пример кода
import jinja2
import scrubber
def sanitize_html(text):
return jinja2.Markup(scrubber.Scrubber().scrub(text))
jinja_env.filters['sanitize_html'] = sanitize_html
Ответ 2
Вам нужно проанализировать ввод при представлении с использованием подхода белого списка - в этом вопросе есть несколько хороших примеров и жизнеспособные варианты там.
Как только вы это сделаете, вы можете пометить любые переменные, которые будут содержать HTML, который не должен быть экранирован с фильтром safe
:
{{comment|safe}}
Ответ 3
Библиотека Bleach может работать очень хорошо.
Например, если предположить, что переменная 'jinja_env' находится в области видимости:
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
Затем в шаблоне может быть что-то вроде:
<p>{{ my_variable|clean(tags=['img', 'b', 'i', 'em', 'strong'], attributes={'img': ['src', 'alt', 'title', 'width', 'height']}) }}</p>
Вы также можете использовать вызываемый (вместо списка) атрибут, позволяющий более тщательную проверку атрибутов (например, проверку того, что src предоставляет действительный URL-адрес). Документация показывает пример.