Регистрация с помощью django-rest-auth: где установить настройки allauth (подтверждение электронной почты/необходимое имя пользователя)

Я использую django-rest-auth с надстройкой регистрации, которая использует django-allauth для реализации конечных точек регистрации, подтверждения, входа через социальные сети и т. д. Это в основном работает, однако я не могу понять, где разместить определенные настройки, чтобы регистрация и другие конечные точки аутентификации соответствовали различным настройкам allauth. Мои текущие проблемы:

  1. Пользователи могут входить в систему, не подтверждая свою электронную почту — параметр allauth ACCOUNT_EMAIL_VERIFICATION (по умолчанию = 'необязательно') определяет, является ли это обязательным.
  2. Пользователи должны указать имя пользователя при регистрации, несмотря на то, что оно не требуется моей моделью пользователя (адрес электронной почты - это мое поле имени пользователя) - параметр allauth ACCOUNT_USERNAME_REQUIRED (по умолчанию = True) управляет этим

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

....
ALLAUTH = {
    'ACCOUNT_EMAIL_VERIFICATION': 'mandatory',
    'ACCOUNT_USERNAME_REQUIRED': False,
}
....

Однако при просмотре сериализаторов allauth и django-rest-auth настройки allauth проверяются следующим образом (из django-rest-auth LoginSerializer):

# If required, is the email verified?
    if 'rest_auth.registration' in settings.INSTALLED_APPS:
        from allauth.account import app_settings
        if app_settings.EMAIL_VERIFICATION == app_settings.EmailVerificationMethod.MANDATORY:
            email_address = user.emailaddress_set.get(email=user.email)
            if not email_address.verified:
                raise serializers.ValidationError(_('E-mail is not verified.'))

Глядя на django-rest-auth/registration RegisterSerializer похоже:

try:
  from allauth.account import app_settings as allauth_settings
  from allauth.utils import (email_address_exists,
                           get_username_max_length)
  from allauth.account.adapter import get_adapter
  from allauth.account.utils import setup_user_email
except ImportError:
  raise ImportError('allauth needs to be added to INSTALLED_APPS.')
....
class RegisterSerializer(serializers.Serializer):
  username = serializers.CharField(
    max_length=get_username_max_length(),
    min_length=allauth_settings.USERNAME_MIN_LENGTH,
    required=allauth_settings.USERNAME_REQUIRED
  )
  email = serializers.EmailField(required=allauth_settings.EMAIL_REQUIRED)
  password1 = serializers.CharField(required=True, write_only=True)
  password2 = serializers.CharField(required=True, write_only=True)

В обоих местах настройки allauth импортируются непосредственно из allautha.account.app_settings, а не settings.py, как я и ожидал. В исходнике allauth на github я вижу файл app_settings, однако значит ли это, что мне нужно поместить туда нужные мне настройки? Разве смысл settings.py не в том, чтобы быть единым местом для сопоставления настроек установленных приложений?


person dkhaupt    schedule 05.05.2016    source источник


Ответы (1)


Выяснилось, что это оказалось довольно просто, и я думаю, что кое-что я мог почерпнуть из документации, хотя это далеко не ясно.

Вместо определения allauth настроек в settings.py следующим образом:

....
ALLAUTH = {
'ACCOUNT_EMAIL_VERIFICATION': 'mandatory',
'ACCOUNT_USERNAME_REQUIRED': False,
}
....

Это нужно сделать так:

ACCOUNT_EMAIL_VERIFICATION = 'mandatory'
ACCOUNT_USERNAME_REQUIRED = False

Просто прямо в settings.py, идентификатор не нужен. Я не уверен, почему они не в своем разделе, но это определенно работает. Надеюсь, у вас нет другого приложения с настройками с таким же названием, хотя я уверен, что есть способ обойти это.

Я нашел этот вопрос + ответ, который меня подсказал.

person dkhaupt    schedule 06.05.2016