我正在设置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()
答案 0 :(得分: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(如果以后需要,它可以支持注册流程和社交登录)