Активация электронной почты не работает в django
как отправить письмо активации
current_site = get_current_site(request)
email_subject = 'confirm your email !'
message2= render_to_string('authentication/emailConfirmation.html',{
'name':user.first_name + user.last_name,
'domain':current_site.domain,
'uid':urlsafe_b64encode(force_bytes(user.pk)),
'token':generate_token.make_token(user)})
email= EmailMessage(
email_subject,
message2,
settings.EMAIL_HOST_USER,
[user.email],
)
email.send()
Активировать вид
from django.core.mail import send_mail ,EmailMessage
from django.http import Http404, HttpResponse
from django.contrib.sites.shortcuts import get_current_site
from django.utils.encoding import force_bytes , force_str
from django.utils.http import urlsafe_base64_decode
from . tokens import generate_token
def activate(request, uidb64, token):
try:
uid = force_str(urlsafe_base64_decode(uidb64))
user = User.objects.get(pk=uid)
except (TypeError, ValueError, OverflowError, User.DoesNotExist):
raise Http404("Invalid activation link")
if generate_token.check_token(user, token):
user.is_active = True
user.save()
login(request, user)
messages.success(request, "Your account has been activated!")
return redirect(reverse('index'))
else:
raise ValidationError("Invalid activation link")```
the token.py file
from django.contrib.auth.tokens import PasswordResetTokenGenerator from six import text_type
class TokenGenerator(PasswordResetTokenGenerator): def _make_hash_value(self, user, timestamp): return (text_type(user.pk) + text_type(timestamp))
generate_token = TokenGenerator()``
шаблон письма подтверждения
{% autoescape off %}
Confirmation Link: http://{{ domain }}{% url 'activate' uidb64=uid token=token %}
{% endautoescape %}
всякий раз, когда я нажимаю на ссылку подтверждения, она автоматически не работает
Похоже, вы можете получить значение uidb64 из URL, как "b'MzI='"
, поэтому оно будет декодировано следующим образом:
uidb64 = "b'MzI='"
base64.b64decode(val[2:-1])
Ну, проблема заключалась в процессе кодирования. Вместо использования urlsafe_b64encode из модуля base64, который относится к Python, в контексте Django лучше использовать функцию urlsafe_base64_encode из django.utils.http. Поскольку urlsafe_b64encode - это функция Python, а urlsafe_base64_encode специально предназначена для Django