В этой лекции мы поговорим о том, как защитить ваши приложения от всякого рода "вредоносных данных". Встречайте валидацию!
Понятие валидации данных
Валидация данных — это тот самый могучий щит вашего приложения, который защищает его от некорректных или вредоносных данных. Валидация проверяет, что данные соответствуют ожидаемому формату и требованиям. Это позволяет не только избежать ошибок, но и защитить вашу базу данных от странных (и порой даже смешных) инъекций вроде '); DROP TABLE users; --.
Вот пример. Допустим, вы сделали поле для ввода электронной почты, а пользователь ввёл "ялюблюпитон". Очевидно, это не электронная почта. Чтобы данные были корректными, нам нужно убедиться, что пользователь ввёл значение в формате something@example.com. Это и называется валидацией.
Где применяется валидация в Django? Django Forms интегрируют валидацию прямо в свои поля. Это означает, что вам не придётся вручную проверять каждое поле — достаточно использовать встроенные валидаторы и расслабиться.
Когда вы вызываете метод .is_valid() на форме, Django автоматически запускает валидацию для всех полей.
Встроенные валидаторы Django
Django предлагает целый арсенал встроенных валидаторов. Словно у вас есть коробка инструментов на все случаи жизни: даже если не все сразу вам понадобятся, знать об их существовании крайне полезно.
Вот основные встроенные валидаторы, которые могут вам пригодиться:
EmailValidator: чтобы ваше поле действительно содержало корректный адрес электронной почты.URLValidator: для проверки корректности URL.MinLengthValidatorиMaxLengthValidator: для ограничения длины строк.RegexValidator: для проверки данных с помощью регулярных выражений.
Использование встроенных валидаторов
Давайте создадим простую форму регистрации, используя EmailValidator и MaxLengthValidator. Эта форма будет проверять, что введен корректный адрес электронной почты и имя пользователя не превышает 30 символов.
from django import forms
from django.core.validators import EmailValidator, MaxLengthValidator
class RegistrationForm(forms.Form):
username = forms.CharField(
max_length=30,
validators=[MaxLengthValidator(30)],
label="Имя пользователя"
)
email = forms.EmailField(
validators=[EmailValidator(message="Введите корректный email.")],
label="Электронная почта"
)
password = forms.CharField(
widget=forms.PasswordInput,
label="Пароль"
)
Встроенные валидаторы в действии
Попробуем интегрировать эту форму в простое представление и убедимся, что валидация работает, как и ожидалось. Пусть будет простое представление, обрабатывающее GET и POST запросы.
from django.shortcuts import render
from django.http import HttpResponse
from .forms import RegistrationForm
def register(request):
if request.method == 'POST':
form = RegistrationForm(request.POST)
if form.is_valid():
# Здесь будет код для обработки данных формы
return HttpResponse("Регистрация прошла успешно!")
else:
return render(request, 'register.html', {'form': form})
else:
form = RegistrationForm()
return render(request, 'register.html', {'form': form})
Шаблон register.html должен отображать форму и ошибки, если таковые имеются:
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Зарегистрироваться</button>
</form>
{% if form.errors %}
<ul>
{% for field in form %}
{% for error in field.errors %}
<li>{{ error }}</li>
{% endfor %}
{% endfor %}
</ul>
{% endif %}
Попробуйте ввести некорректный email или слишком длинное имя пользователя, и вы увидите, как валидаторы не дадут данным пройти дальше.
Обработка ошибок валидации
Теперь, когда мы получаем ошибки, нужно их правильно обработать и отобразить для пользователя. Никто не любит загадочные сообщения от системы, так что давайте научимся делать сообщения об ошибках более понятными и дружелюбными.
Когда форма не проходит валидацию, она возвращает набор ошибок. Эти ошибки можно извлечь и отобразить в шаблоне. Мы уже видели, как извлекать ошибки из полей формы, но давайте углубимся в это немного больше.
В коде представления мы можем использовать form.errors для вывода ошибок. Мы уже отображали их в шаблоне, но вот более детализированный способ:
{% if form.errors %}
<ul class="error-list">
{% for field in form %}
{% for error in field.errors %}
<li>{{ field.label }}: {{ error }}</li>
{% endfor %}
{% endfor %}
</ul>
{% endif %}
Кастомизация сообщений об ошибках
Если вам не нравятся стандартные сообщения о том, что "эта форма недопустима", вы можете изменить их с помощью атрибута error_messages в описании полей формы.
username = forms.CharField(
max_length=30,
validators=[MaxLengthValidator(30)],
label="Имя пользователя",
error_messages={
'max_length': 'Имя пользователя не должно превышать 30 символов.'
}
)
Теперь, если пользователь введет слишком длинное имя пользователя, он увидит ваше кастомное сообщение, а не стандартную фразу.
Итоги
Вот и все на сегодня! Теперь у вас есть мощный инструмент для проверки данных в ваших Django приложениях. Валидация данных — это важный этап разработки, и ее правильная реализация поможет вам избежать множества проблем в будущем.
Для более глубокого изучения валидации в Django, рекомендуем ознакомиться с официальной документацией Django.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ