«Безопасное» форматирование текста Python HTML (ala textile) - PullRequest
3 голосов
/ 09 ноября 2009

Я искал существующую библиотеку python в текстильном стиле для форматирования текста для ввода пользователями.

Если бы это было только то, что я вводил, просто текстиль было бы хорошо, но поскольку ввод предназначен для приложения django, которое будет принимать пользовательский ввод и отображать его, сохраняя при этом некоторое форматирование.

Мне удалось найти маленькие лазейки здесь в существующих библиотеках, которые я видел. Иногда они не избегали вещей так, как следовало бы, позволяли мне вводить прямой HTML, и список можно продолжить.

Итак, какие рекомендации по использованию двигателей преобразования я могу использовать?

Ответы [ 3 ]

6 голосов
/ 09 ноября 2009

Если вы используете Django, вы можете попробовать безопасную уценку:

{% load markup %}

{{ foo|markdown:"safe" }}

Вам необходимо установить уценку и django.contrib.markup в ваших settings.py приложениях.

Если вы хотите санировать HTML при сохранении, мне повезло, используя sanitize feedparser (http://www.feedparser.org/).

import feedparser

body = feedparser._sanitizeHTML(body, 'utf8')
2 голосов
/ 27 января 2011

Если вы ищете текстильное решение: PyTextile, который использует разметка django, на самом деле имеет функцию textile_restricted (), которая по какой-то причине никогда не превращалась в django.contrib.markup. Вы можете использовать эту функцию для предоставления ограниченного текстиля. Либо добавив в модель метод, который вызывает textile_restricted, либо используйте пользовательский тег шаблона textile_restricted, определенный следующим кодом:

from django import template
from django.conf import settings
from django.utils.encoding import smart_str, force_unicode
from django.utils.safestring import mark_safe

register = template.Library()

def textile_restricted(value):
    try:
        import textile
    except ImportError:
        if settings.DEBUG:
            raise template.TemplateSyntaxError("Error in {% textile %} filter: The Python textile library isn't installed.")
        return force_unicode(value)
    else:
        return mark_safe(force_unicode(textile.textile_restricted(smart_str(value))))
textile_restricted.is_safe = True

register.filter(textile_restricted)
1 голос
/ 09 ноября 2009

Вы пробовали включить django.contrib.markup библиотеки?

...