使用django-rest-auth注册:在哪里设置allauth设置(电子邮件验证/所需用户名)

时间:2016-05-05 12:23:51

标签: django django-rest-framework django-allauth

我正在使用django-rest-auth注册加载项,该加载项使用django-allauth来实现注册,确认,社交登录等端点。它在很大程度上有效,但我无法弄清楚在何处放置某些设置,以使注册和其他auth端点符合各种allauth设置。我目前的问题是:

  1. 用户可以在不验证其电子邮件的情况下登录 - allauth设置ACCOUNT_EMAIL_VERIFICATION(默认='可选')控制是否强制要求
  2. 用户必须在注册时提供用户名,尽管我的用户模型不需要用户名(电子邮件地址是我的用户名字段) - allauth设置ACCOUNT_USERNAME_REQUIRED(默认= True)控制此
  3. 我尝试添加上述设置来解决这些问题,但注册和登录端点似乎并不尊重它们。例如,来自我的settings.py

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

    但是,在查看allauthdjango-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导入的,正如我所料。在github上的allauth源代码中,我可以看到app_settings文件,但这是否意味着我需要在那里放置我想要的设置? settings.py是不是要整理已安装应用的设置的单一位置?

1 个答案:

答案 0 :(得分:3)

想出来 - 事​​实证明这很简单,我想我可以从文档中收集到的东西,虽然它远非清晰。

而不是像allauth这样定义settings.py设置:

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

需要这样做:

ACCOUNT_EMAIL_VERIFICATION = 'mandatory'
ACCOUNT_USERNAME_REQUIRED = False

直接在settings.py,不需要标识符。我不确定他们为什么不在他们自己的部分,但这绝对有效。希望您没有其他具有相同名称设置的应用程序 - 尽管我确信可以解决这个问题。

我发现this question + answer让我陷入困境。