Правила проверки Django-TinyMCE

#django #django-models #tinymce #django-admin #django-tinymce

#django #django-модели #tinymce #django-администратор #django-tinymce

Вопрос:

Я использую TinyMCE на своем сайте администратора Django. Мне нужно проверить, что запрещенные HTML-теги не отправляются. Это то, что я пробовал:

1) Метод проверки

     def check_for_invalid_html_tags(value) :
        compiled_regex = re.compile('<(?!/?(p|div|ul|li)(>|s))[^<] ?>')

        if compiled_regex.match(value):
            raise ValidationError('Invalid Tags')
 

2) Правило проверки

     content = tinymce_models.HTMLField(validators=[check_for_invalid_html_tags])
 

Похоже, это не работает, так как любая отправка пропускается как действительная. Когда я меняю tinymce_models.HTMLField для моделей.Текстовое поле, правило работает отлично. Таким образом, я считаю, что проблема связана с TinyMCE.

Кто-нибудь может помочь?

Ответ №1:

Я прочитал документ, и есть небольшая разница между match и search

совпадение:

Если в начале строки ноль или более символов…

Поиск:

Просматривайте строку в поисках первого местоположения…

поиск () против сопоставления ()

поскольку то, что вы ищете, может быть везде в вашей строке, вам нужно использовать search вместо match . Другой момент, вам может понадобиться повторно установить fag.S или re.DOTALL, поскольку у вас может быть новая строка во входных данных.

Сделайте так, чтобы специальный символ ‘.’ соответствовал любому символу вообще, включая новую строку; без этого флага ‘.’ будет соответствовать чему угодно, кроме новой строки.

Итак, вот теги check_for_invalid_html_tags в функторе и рабочем решении.

 import re

class CheckForInvalidHtmlTags(object):
    compiled_regex = re.compile('<(?!/?(p|div|ul|li)(>|s))[^<] ?>')

    def __call__(self, value):
        if self.compiled_regex.search(value):
            print 'error'
        else:
            print 'ok'

c = CheckForInvalidHtmlTags()
c('test test <a>test<a> test') # print error
c('test <p> test</p>') # print ok
c('test<a> test</a><p>test</p>test') # print error
 

Комментарии:

1. чтобы использовать его в этом content = tinymce_models.HTMLField(validators=[CheckForInvalidHtmlTags()])

2. в решении используется функтор, но простая функция тоже подойдет

3. Отлично. Проблема заключалась в использовании сопоставления, а не поиска. Спасибо

Ответ №2:

Ваш метод проверки на самом деле должен быть валидатором, который имеет специальные методы, такие как __call__ . Используйте один из основных валидаторов django, например, валидатор регулярных выражений.

 from django.core.validators import RegexValidator

check_for_invalid_html_tags = RegexValidator(
        regex=''<(?!/?(p|div|ul|li)(>|s))[^<] ?>'',
        message='Invalid Tags',
        code='invalid_content'
    )
 

Затем в вашей модели:

 content = tinymce_models.HTMLField(validators=[check_for_invalid_html_tags])
 

Комментарии:

1. Спасибо, Джейми. Я попробовал это, и, похоже, это не сработало. Это приводит к тому, что любая отправка не проходит проверку. Например: если я попробую <tr>Test</tr> , он завершится неудачей. <p>Test</p> также завершается с ошибкой, как и Test. Из этих 3 примеров я бы ожидал, что только 1-й завершится ошибкой, поскольку HTML-тег не разрешен

2. Что нужно проверяющему, так это вызываемый объект, то есть либо простая функция, либо функтор: функтор — это объект, который переопределяет метод __call__ . Я думаю, что в этом случае функтор может быть «лучше», поскольку регулярное выражение должно быть скомпилировано один раз.

3. MoiTux, вы правы, но компиляция регулярного выражения оказывает незначительное влияние на производительность, особенно для этого варианта использования. У валидатора есть и другие функции, удобные для разработчика, включая инициализацию и эквалайзер . В этом случае переписывать их неразумно.