Django-allauth застрял на регистрации и запутался в headless=True
Я пытаюсь настроить приложение django-allauth, чтобы оно использовалось для аутентификации во фронт-энде react app и мобильном приложении. Есть некоторые несоответствия, которые, скорее всего, просто из-за того, что я не разобрался в чем-то. Но тонны гугления и AI не помогают.
Я выполнил настройку (несколько раз) в соответствии с руководством и с помощью postman, и я смог успешно вызвать /auth/login
для пользователя, который был создан с помощью createsuperuser
Моя путаница/неуверенность начинается, когда я пытаюсь зарегистрировать нового пользователя через /auth/signup
. Это «вроде как» успешно. Я говорю «как бы», потому что пользователь действительно создается в БД, но я не получаю электронного письма с просьбой Confirm Their Email
.
Однако, когда я пытаюсь зарегистрировать тот же email/пользователя снова, я получаю письмо с текстом [example.com] Account Already Exists
. Таким образом, я знаю, что доставка электронной почты (с помощью mailhog) работает.
Вот мои настройки allaluth:
HEADLESS_ONLY = False
ACCOUNT_USER_MODEL_USERNAME_FIELD = None
ACCOUNT_LOGIN_METHODS = {
"email",
}
ACCOUNT_SIGNUP_FIELDS = ["email*", "password1*",]
ACCOUNT_SIGNUP_FORM_CLASS = "authy.forms.CustomSignupForm"
ACCOUNT_EMAIL_VERIFICATION = "mandatory" # Ensures users must verify their email
ACCOUNT_EMAIL_VERIFICATION_BY_CODE_ENABLED = True
ACCOUNT_EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL = None # or a url
ACCOUNT_EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL = None # or a url
ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS = 3
У меня есть форма регистрации, как показано ниже:
class CustomSignupForm(forms.Form):
email = forms.CharField(required=True, label="Email Address")
mobile_number = forms.CharField(max_length=20, required=True, label="Mobile Number")
first_name = forms.CharField(max_length=50, required=True, label="First Name")
last_name = forms.CharField(max_length=50, required=True, label="Last Name")
def signup(self, request, user):
"""This method is automatically called by AllAuth after signup.
"""
user.mobile_number = self.cleaned_data["mobile_number"]
user.save()
HEADLESS = TRUE
Описанный выше сценарий - это когда у меня есть headless = False
.
Учитывая, что я создаю Django API, который будет использоваться react front end, я предположил, что мне нужно установить headless = True
. Однако если я это сделаю, то обнаружу, что при первом создании пользователя с помощью auth/signup
я получаю сообщение 401 и следующие подробности. I still DON'T get an email.
{
"status": 401,
"data": {
"flows": [
{
"id": "login"
},
{
"id": "signup"
}
]
},
"meta": {
"is_authenticated": false,
"session_token": "m18gi8fso3hj75l7ogrhv47bn45jqcap"
}
}
Если я пытаюсь зарегистрировать те же данные снова, я получаю ошибку Reverse for 'account_signup' not found. 'account_signup' is not a valid view function or pattern name.
Гугление этой ошибки показывает, что это потому, что у меня нет path("accounts/", include("allauth.urls")),
в urls.py. Но, насколько я понимаю, в headless такие URL не ожидаются?
Я также заметил, что когда пользователь регистрируется, все поля в форме автоматически сохраняются, кроме mobile_number
. Поэтому мне приходится явно назначать его экземпляру пользователя и сохранять (обновлять). Что я упускаю?
Подводя итог моему непониманию:
- Пользователь создается, но письмо не отправляется. Однако, когда я снова отправляю эту полезную нагрузку, я могу получить электронное письмо? Есть ли какая-то настройка, которую я не включил?
- Почему я получаю ошибку о
account_signup not found
, но когда я устанавливаюheadless = True
, эти API даже не отображаются, когда я делаюpython manage.py show_url
(используя djang-extensions)? В каком-то потоке/выпуске/reddit/ai, кажется, говорилось, что при использованииheadless = True
мы не можем воспользоваться автоматической рассылкой писем и другими подобными функциями. Что мы должны создавать их самостоятельно? Я сомневаюсь в этом, но, следовательно, причина этого вопроса здесь. - Почему
mobile_number
не сохраняется автоматически, как все остальные поля? Должен ли я вообще использовать пользовательскую форму, когдаheadless = True
или я должен построить все мои API, используя DRF Views и Serialilzers? Обратите внимание, что mobile_number - это поле в существующей пользовательской модели пользователя .