Подтверждение слизняка в Джанго - PullRequest
7 голосов
/ 02 июня 2009

Я предполагаю, что это будет включать регулярное выражение или что-то в этом роде, но я попробую. В данный момент пользователь может взломать сайт, введя что-то похожее на £$(*£$(£@$&£($ в поле заголовка, которое преобразуется в слаг с помощью Django slugify.

Поскольку ни один из этих символов не может быть преобразован, Django возвращает ошибку. Мой вопрос: что я должен добавить в метод проверки формы, чтобы поднять forms.ValidationError, когда пользователь использует такой заголовок?

Спасибо.

Ответы [ 2 ]

12 голосов
/ 24 июня 2011
SLUG_REGEX = re.compile('^[-\w]+$')
12 голосов
/ 02 июня 2009

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

В наши дни самый простой способ обработки слизней в формах - просто использовать django.models.SlugField. Он подтвердит себя и подразумевает, что это поле является индексом.

Если вы не используете это в модели, вы все равно можете подключить тот же валидатор, который использует SlugField:

from django.core.validators import validate_slug

slug = forms.CharField(..., validators=[validate_slug])

Если вы просто хотите выполнить закулисную проверку или написать свой собственный валидатор, вы можете использовать аналогичную технику для определения в Django действительного слага. Это просто скомпилированное регулярное выражение, которое использует validate_slug выше:

from django.core.validators import slug_re

if slug_re.match(...):
    ...

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

...