Токен Django не действителен
Я пытаюсь создать процесс для проверки электронной почты пользователя перед ее изменением. Однако токен продолжает считаться недействительным. Есть помощь?
Мнения:
def _send_verification_email(user=None,email=None,request=None):
current_site = get_current_site(request)
message = render_to_string('emails/email_verification.html', {
'user': user,
'domain': current_site.domain,
'uid': urlsafe_base64_encode(force_bytes(user.pk)),
'token': default_token_generator.make_token(user),
'email':urlsafe_base64_encode(force_bytes(email)),
'email_unencoded':email,
})
user.send_email(mail_subject='Verify your email address', message=message)
def verify_changed_email(request,uidb64=None,token=None,email=None):
try:
uid = urlsafe_base64_decode(uidb64).decode()
user = Account.objects.get(pk=uid)
except(TypeError, ValueError, OverflowError, Account.DoesNotExist):
user = None
if user is not None and default_token_generator.check_token(user, token):
email = urlsafe_base64_decode(email).decode()
user.email = email
user.save()
auth.login(request, user)
messages.success(request, 'Your email has been changed.')
return redirect('/')
else:
messages.error(request, 'An error has occurred. This link is not valid.')
return redirect('/')
Проверка формы, это работает.
if form.is_valid() and account_settings_form.is_valid():
self.object = form.save()
try:
user = Account.objects.get(id=self.request.user.id)
if account_settings_form.instance.email != user.email:
_send_verification_email(email=account_settings_form.instance.email, user=user, request=self.request)
account_settings_form.instance.email = user.email
messages.success(self.request,'We sent you an e-mail for further verification!')
account_settings_form.save()
except ValueError as e:
messages.error(self.request, e)
return self.render_to_response(self.get_context_data(form=form))
URL в электронной почте, и urlpatterns
http://{{domain}}{% url 'accounts:verify_changed_email' uidb64=uid token=token email=email %}
path('change-email/<uidb64>/<email>/<token>/',account_views.verify_changed_email,name='verify_changed_email'),
Он продолжает не проходить эту проверку, токен продолжает считаться недействительным:
if user is not None and default_token_generator.check_token(user, token):
Есть идеи, почему он продолжает терпеть неудачу? Каким может быть решение? Похоже, что генератор токенов по умолчанию использует email для хэширования токена, но при проверке email еще не изменился. Я убедился в этом, передав объект Account из базы данных вместо запроса, а затем изменив email на старый email перед сохранением формы.