Проблема: Я использую встроенный класс Django "PasswordResetTokenGenerator" для создания токена, для ссылки активации учетной записи пользователя, которая отправляется пользователю по электронной почте после отправки RegistrationForm. (Я использую Celeryи RabbitMQ для выполнения задач и очереди сообщений)
views.py (RegistrationView)
class MyUserCreationView(FormView):
template_name = 'accounts/auth/register.html'
form_class = MyUserCreationForm
def form_valid(self, form):
user = form.save(commit=False)
user.is_active = False
email = user.email
user.save()
current_site = str(get_current_site(self.request))
confirm_mail.apply_async((user.username, current_site), countdown=5)
return render(self.request, 'accounts/auth/register.html', {'email': email})
tokens.py
from django.contrib.auth.tokens import PasswordResetTokenGenerator
from django.utils import six
class TokenGenerator(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 = TokenGenerator()
tasks.py (задача Celery) Отправка электронной почты пользователю
from django.core.mail import send_mail
from django.contrib.auth.models import User
from django.template.loader import render_to_string
from django.utils.encoding import force_bytes
from django.utils.http import urlsafe_base64_encode
from django.shortcuts import get_object_or_404
from celery import task
from ecommerce.settings.base import EMAIL_HOST_USER
from account.tokens import account_activation_token
@task
def confirm_mail(user_name, current_site):
user_obj = get_object_or_404(User,username=user_name)
token=account_activation_token.make_token(user_obj)
subject = 'Activate your MissIndia account.'
message = render_to_string(
'email/acc_activate_email.html',
{
'user': user_obj,
'domain': current_site,
'uid': urlsafe_base64_encode(force_bytes(user_obj.pk)).decode(),
'token': token,
}
)
mail_sent = send_mail(subject, message, EMAIL_HOST_USER, [
user_obj.email], fail_silently=False)
return mail_sent
urls.py
from django.urls import path, re_path
from . import views
app_name = 'accounts'
urlpatterns = [
re_path('confirm-email/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$', views.activate, name='activate'),
]
views.py (Активировать учетную запись)
def activate(request, uidb64, token):
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):
user.is_active = True
user.save()
# login(request, user)
# return redirect('home')
return HttpResponse('Thank you for your email confirmation. Now you can login your account.')
else:
return HttpResponse('Activation link is invalid!')
ПРИМЕЧАНИЕ: Путем выполнения SSH в моем экземпляре EC2, если я выполняю функцию verify_mail () в задачах.py с использованием команд оболочки Django Отправляет действительную ссылку активации.