Django 2注册确认电子邮件指向主页而不是登录页面

问题描述 投票:0回答:1

我正在设置我的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.朋友

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

tokens.朋友

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()
django django-views django-2.0
1个回答
1
投票

我无法确认整个注册功能是否有效,但为了回答您的具体问题,您的代码正在创建一个activation_link,其设置为:

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(如果以后需要,它支持注册流程和社交登录)

© www.soinside.com 2019 - 2024. All rights reserved.