Попытка подтвердить пользователя с помощью Django подтверждения по электронной почте, однако некоторые пользователи получают эту ошибку при попытке подтвердить свою электронную почту - PullRequest
0 голосов
/ 28 января 2020

Я задавал вариант этого вопроса раньше, но понял, что мне очень непонятно. Это моя попытка лучше объяснить проблему.

Я отправляю ссылку на электронную почту пользователя, чтобы подтвердить регистрацию после регистрации на сайте. Однако небольшая часть пользователей получает следующую ошибку при попытке подтвердить свою электронную почту.

Ошибка:

TypeError/activate/{uidb64}/{token}/
error
'AnonymousUser' object is not iterable

Мне кажется, проблема в том, что функция активации не распознает их. Однако не уверен, как заставить эту ссылку активации работать, если я отправлю их обратно на страницу входа. Любые идеи?

Нужно ли добавить что-то вроде «если не user.is_authenticated:», а затем отправить перенаправление для входа в систему? Но как мне вернуться, чтобы активировать функцию? Вход в мое приложение является общим для всех ситуаций.

Активируйте код:

try:
    uid = force_text(urlsafe_base64_decode(uidb64))
    user = User.objects.get(pk=uid)
except(TypeError, ValueError, OverflowError, User.DoesNotExist):
    user = None
if user is not None and account_activation_token.check_token(user, token):
    .... do something
else:
    return HttpResponse('Activation link is invalid!')

Здесь я создаю письмо:

def activation_email(request):
    if request.user.is_authenticated:
        user=request.user
        message = render_to_string('email.html', {
                'user':user,
                'token':account_activation_token.make_token(user),
                'uid':urlsafe_base64_encode(force_bytes(user.pk)),
        })
        ....send mail
    else:
        return redirect('somewhere_else')

РЕДАКТИРОВАТЬ>: не удается когда я пытаюсь обновить свою модель, указав информацию для подтверждения адреса электронной почты:

if user is not None and account_activation_token.check_token(user, token):
      object, created = User_Profile.objects.get_or_create(
            user=request.user,
            ## This is where it fails
            email_validated=True,
        )

1 Ответ

1 голос
/ 28 января 2020

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

А что касается ошибки, когда пользователи активируются, вы получили информацию о пользователе здесь:

if user is not None and account_activation_token.check_token(user, token):  # <-- in user variable

Так почему бы не использовать ее в следующем разделе (согласно комментариям):

obj, created = User_Profile.objects.get_or_create(
    user=user,  # <-- here
    email_validated=True,
)
...