Django allauth - ACCOUNT_UNIQUE_EMAIL не предотвращает дублирование писем при регистрации
Я создаю базовый сайт, на котором пользователи регистрируются с помощью электронной почты, имени пользователя и psssword.
Я использую dj_rest_auth
, который оборачивает allauth
для предоставления интерфейса REST API. Вот пример вызова регистрации:
POST: http://127.0.0.1:8000/api/auth/registration/
Body:
{
"username": "new_user3",
"password1": "testtest@123",
"password2": "testtest@123",
"email": "h@h.com"
}
Вот флаги, которые я установил в settings.py
:
ACCOUNT_EMAIL_VERIFICATION = 'none'
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_USERNAME_REQUIRED = True
ACCOUNT_UNIQUE_EMAIL = True
При этом, когда я отправляю запрос на регистрацию дважды и меняю только имя пользователя (не электронную почту), все проходит нормально:
Как проще всего сделать так, чтобы письмо не срабатывало, если оно является дубликатом? В идеале мне нужно что-то, что предоставляет сама библиотека, а не пользовательский класс.
В документации к настройкам allauth [allauth-docs] говорится:
ACCOUNT_UNIQUE_EMAIL
(по умолчанию:True
)Обеспечьте уникальность адресов электронной почты. На уровне базы данных это означает, что только одна учетная запись пользователя может иметь адрес электронной почты, помеченный как проверенный. Формы не позволяют пользователю регистрироваться или добавлять дополнительный адрес электронной почты, если этот адрес используется другой учетной записью.
Исходный код [GitHub] также, кажется, указывает на это:
class Migration(migrations.Migration): # … operations = ( [ migrations.AlterUniqueTogether( name="emailaddress", unique_together={("user", "email")}, ), migrations.AddConstraint( model_name="emailaddress", constraint=models.UniqueConstraint( condition=models.Q(("verified", True)), fields=["email"], name="unique_verified_email", ), ), ] if getattr(settings, "ACCOUNT_UNIQUE_EMAIL", True) else [] )
Итак, часть conditon=Q(verified=True)
говорит, что email
должен быть уникальным, только для строк с verified=True
.
Обратите внимание, что при этом даже не проверяется, является ли электронная почта уникальной с учетом регистров, поэтому Foo@bar.com
и foo@bar.com
воспринимаются как разные адреса электронной почты.