Jinja2 экранирует весь HTML, кроме img, b и т. Д. - PullRequest
14 голосов
/ 23 января 2012

Jinja2 автоматически экранирует все теги HTML, но я не хочу избегать некоторых тегов (например, img, b и некоторых других).Как я могу это сделать?

Ответы [ 3 ]

11 голосов
/ 23 января 2012

Вы захотите проанализировать входные данные при отправке с использованием подхода белого списка - есть несколько хороших примеров в этом вопросе и жизнеспособных вариантов там.

Как только вы это сделаете, вы можете пометить любые переменные, которые будут содержать HTML, которые не должны быть экранированы с помощью фильтра safe:

{{comment|safe}}
11 голосов
/ 23 января 2012

Вы можете написать свой собственный фильтр.Библиотека скруббер очень хорошо подходит для очистки 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
7 голосов
/ 25 ноября 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...