我正在使用django-rest-auth
注册加载项,该加载项使用django-allauth
来实现注册,确认,社交登录等端点。它在很大程度上有效,但我无法弄清楚在何处放置某些设置,以使注册和其他auth端点符合各种allauth
设置。我目前的问题是:
allauth
设置ACCOUNT_EMAIL_VERIFICATION(默认='可选')控制是否强制要求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
导入的,正如我所料。在github上的allauth
源代码中,我可以看到app_settings
文件,但这是否意味着我需要在那里放置我想要的设置? settings.py
是不是要整理已安装应用的设置的单一位置?
答案 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让我陷入困境。