我上个星期花了大约20个小时,无法解决。这是我的第一个Django应用程序。
我已经在外壳中测试了“ urlsafe_base64_encode(force_bytes(user.pk))”,它可以通过用户的“ uid”,但是在应用程序本身中不起作用。我知道,即使该链接传递了正确的主键,所有链接的“激活链接都是无效的”,我不确定出了什么问题。
请帮助。
views.py/注册页面
from_email, subject = 'domain <info@domain>', 'Email verification'
htmly = get_template('activation_email_template.html')
username = user.username
message = render_to_string('activation_email.html', {
'user':user,
'token':account_activation_token.make_token(user),
'uid':urlsafe_base64_encode(force_bytes(user.pk)),
})
d = {'username': username, 'url':reverse('activate',
kwargs={
'token':account_activation_token.make_token(user),
'uidb64':urlsafe_base64_encode(force_bytes(user.uid))
})}
html_content = htmly.render(d)
msg = EmailMultiAlternatives(subject, message, from_email,[user.email])
msg.attach_alternative(html_content, "text/html")
msg.send()
这是我的activate / views.py:
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):
...
else:
return HttpResponse('Activation link is invalid!')
由于某种原因,每次尝试此操作时,都会收到“激活链接无效”。我知道它发送的是正确的PK,因为我可以在该URL上叮当响,并且该URL与正确编码的PK是正确的。但是,激活视图无法识别此pk。
这是我的activation_email.html:
{% autoescape off %}
Hi {{ user.username }},
Thanks for creating an account. Please click on the link to confirm your registration,
http://domain{% url 'activate' uidb64=uid token=token %}
{% endautoescape %}
这是激活电子邮件模板:
<h3>Hi <strong>{{ username }}</strong>,</h3>
<p>Thanks for creating an account. Please click on the following link to confirm your registration:</p>
<a style="background-color: #f79407 ;padding: 10px 15px; text-decoration: none;color: #ffffff;text-transform: uppercase;font-size: 15px;" href="https://domain{{ url }}">Email Activation</a>
请帮助!
尝试此操作以获取激活链接中的错误,但仍然只是获取激活链接无效:
try:
uid = force_text(urlsafe_base64_decode(uidb64))
user = User.objects.get(pk=uid)
except TypeError:
print('typerror')
user=None
except ValueError:
print('valueerror')
user=None
except OverflowError:
print('OverflowError')
user=None
except User.DoesNotExist:
print('user.DoesNotExist')
user=None
if user is not None and account_activation_token.check_token(user, token):
....
else:
raise ValidationError('user is none')