Django PasswordResetTokenGenerator, check_token (user, token) возвращает False на производстве, локально работает нормально - PullRequest
0 голосов
/ 19 февраля 2019

Проблема: Я использую встроенный класс 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 Отправляет действительную ссылку активации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...