Я пытаюсь создать систему, в которой пользователи могут определять и тестировать свои собственные шаблоны регулярных выражений. Для этого у меня есть следующая установка:
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
. Это действительно необходимо? Есть ли более идеальный способ сделать это? Это немного похоже на хакерство.
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
andexcept
statements. The technique contrasts with the LBYL style common to many other languages such as C.
Я также не вижу встроенного способа проверить строку как шаблон регулярного выражения, не пытаясь использовать или скомпилировать ее. Однако я бы предложил создать пользовательское поле модели для шаблонов регулярных выражений, чтобы вы могли инкапсулировать эту проверку и потенциально повторно использовать функциональность в других моделях.
Выполните проверку при отправке формы. И да, некоторые шаблоны не скомпилируются.