Вопрос

Программируя веб-приложение на Python, я хочу создать текстовую область, в которую пользователи могут вводить текст на облегченном языке разметки. Текст будет импортирован в HTML-шаблон и просмотрен на странице. Сегодня я использую эту команду для создания текстовой области, которая позволяет пользователям вводить любой (HTML) текст:

my_text = cgidata.getvalue('my_text', 'default_text')
ftable.AddRow([Label(_('Enter your text')),
               TextArea('my_text', my_text, rows=8, cols=60).Format()])

Как я могу изменить это так, чтобы разрешалась только некоторая (безопасная, в конечном итоге легкая) разметка? Все предложения, включая дезинфицирующие средства, приветствуются, если они легко интегрируются с Python.

Это было полезно?

Решение

Используйте реализацию уценки на языке Python

import markdown
mode = "remove" # or "replace" or "escape"
md = markdown.Markdown(safe_mode=mode)
html = md.convert(text)

Он очень гибкий, вы можете использовать различные расширения, создавать свои собственные и т. д.

Другие советы

Вы можете использовать реструктурированный текст . Я не уверен, что у него есть опция очистки, но он хорошо поддерживается Python и генерирует все виды форматов.

Эта простая дезинфицирующая функция использует белый список и примерно такая же, как решение python-html -sanitizer-scrubber-filter , но также позволяет ограничить использование атрибутов (поскольку вы, вероятно, не хотите, чтобы кто-то использовал, среди прочего, атрибут style ):

from BeautifulSoup import BeautifulSoup

def sanitize_html(value):
    valid_tags = 'p i b strong a pre br'.split()
    valid_attrs = 'href src'.split()
    soup = BeautifulSoup(value)
    for tag in soup.findAll(True):
        if tag.name not in valid_tags:
            tag.hidden = True
        tag.attrs = [(attr, val) for attr, val in tag.attrs if attr in valid_attrs]
    return soup.renderContents().decode('utf8').replace('javascript:', '')
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top