Библиотека 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). Документация показывает пример .