Django 2 электронное письмо с подтверждением регистрации направляется на домашнюю страницу вместо страницы входа - PullRequest
0 голосов
/ 09 марта 2019

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

Пока мне удалось настроить его (с помощью другого поста), и все работает до момента нажатия на электронное письмо с активацией.

Когда я копирую и вставляю ссылкув браузер, он направляет меня на главную страницу входа, а не на страницу входа.

Кто-нибудь может просмотреть мои взгляды и посмотреть, не пропало ли что-то?

def register_view(request):
    if request.method == 'POST':
        # Post request.
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.is_active = False
            user.save()

        mail_subject = 'Activate your account.'
        current_site = get_current_site(request)
        uid = urlsafe_base64_encode(force_bytes(user.pk)).decode()
        token = account_activation_token.make_token(user)
        activation_link = "{0}/?uid={1}&token{2}".format(current_site, uid, token)
        message = "Hello {0},\n {1}".format(user.username, activation_link)
        to_email = form.cleaned_data.get('email')
        email = EmailMessage(mail_subject, message, to=[to_email])
        email.send()
        return HttpResponse('Please confirm your email address to complete the registration')

       else:
           # Get request.
           form = UserRegisterForm()
       return render(request, 'users/register.html', {'form': form})

def activate(request, uidb64, token):
        try:
            uid = urlsafe_base64_decode(uidb64).decode()
            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):
            # activate user and login:
            user.is_active = True
            user.save()
            messages.success(request, f'Your account has been created {username}. Login.')
            return render(request, 'users/login.html')
        else:
            return HttpResponse('Activation link is invalid!')

urls.py

path('activate/<str:uid>/<str:token>',
    user_views.activate,
    name='activate'),

tokens.py

class AccountActivationTokenGenerator(PasswordResetTokenGenerator):
    def _make_hash_value(self, user, timestamp):
        return (
            six.text_type(user.pk) +
            six.text_type(timestamp) +
            six.text_type(user.is_active)
        )

account_activation_token = AccountActivationTokenGenerator()

1 Ответ

1 голос
/ 09 марта 2019

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

activation_link = "{0}/?uid={1}&token{2}".format(current_site, uid, token)

, который, если вы посмотрите внимательно, создает что-то вроде:

http://example.com/?uid=....&token=....

но ваш путь в urls.py равен

path('activate/<str:uid>/<str:token>', user_views.activate, name='activate')

, что означает, что он ожидает что-то вроде

http://example.com/activate/..../....

Следовательно, исправление состоит в том, чтобы просто поменять Activation_link на

activation_link = "{0}/activate/{1}/{2}".format(current_site, uid, token)

Опять же, просто задаю конкретный вопрос, который вы задаете.

Помимо вашего вопроса, вы можете посмотреть существующие пакеты, такие как django-registration или более полный пакет, такой как django-allauth (который поддерживает поток регистрации и социальные входы в систему, если потребуется позже)

...