Может ли значение TextField объекта Django не компилироваться как шаблон регулярного выражения?

Я пытаюсь создать систему, в которой пользователи могут определять и тестировать свои собственные шаблоны регулярных выражений. Для этого у меня есть следующая установка:

import re

class ExtendedRegexValidator(models.Model):
    pattern = models.TextField(
        _('pattern'),
        help_text=_('Required. Must be a valid regular expression pattern.')
    )

    def save(self, *args, **kwargs):
        try:
            re.compile(self.pattern)
        except Exception as e:
            # handle exception
        super(ExtendedRegexValidator, self).save(*args, **kwargs)

Перед сохранением я пытаюсь скомпилировать шаблон регулярного выражения, используя значение поля pattern модели, которое является TextField. Это действительно необходимо? Есть ли более идеальный способ сделать это? Это немного похоже на хакерство.

Выполните проверку при отправке формы. И да, некоторые шаблоны не скомпилируются.

John Gordon 08.04.2019 00:24
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Is this actually necessary?

Да, проверка необходима, так как будут допустимые строки, которые не являются допустимыми регулярными выражениями. См. документы Python на re.error:

Exception raised when a string passed to one of the functions here is not a valid regular expression (for example, it might contain unmatched parentheses) or when some other error occurs during compilation or matching.

Другие предлагали вместо этого выполнять эту проверку во время отправки формы, но ради целостности данных я думаю, что вы были правы, сделав это на уровне модели. Обрабатывая re.error, вы можете поднять ValidationError, который может быть перехвачен на уровне отправки формы.

Is there a more ideal way to do this? This kinda feels hacky.

Ваш код проверки соответствует философии Python EAFP:

Easier to ask for forgiveness than permission. This common Python coding style assumes the existence of valid keys or attributes and catches exceptions if the assumption proves false. This clean and fast style is characterized by the presence of many try and except statements. The technique contrasts with the LBYL style common to many other languages such as C.

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

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