Я не могу проверить электронную почту пользователя в django

У меня есть приложение django с аутентификацией и проверкой электронной почты. Сначала пользователь вводит учетные данные в форму, затем я отправляю ему письмо со ссылкой на верификацию. И теперь я получаю ошибку. Когда пользователь нажимает на ссылку в письме, он говорит, что токен не распознан.

from .utils import generate_token
class PersonalRegister(View):

    def post(self, request, *args, **kwargs):
        ...
        #get data from form using request.POST.get

        #sends email
        current_site = get_current_site(request)
        email_subject = 'Activate account | Zane'
        email_body = render_to_string('authentication/email/email_body.html', {
            'user': models.PersonalUser,
            'domain': current_site,
            'uid': urlsafe_b64encode(force_bytes(user.pk)),
            'token': generate_token.make_token(user)
        })

        email = EmailMessage(subject=email_subject, body=email_body, from_email=settings.EMAIL_FROM_USER, to=[user.email])
        email.send()
        ...

    def get(self, request, *args, **kwargs):
        return render(request, 'authentication/personal/personal_signup.html')

Из .utils я импортировал эту функцию:

from time import time
from django.contrib.auth.tokens import PasswordResetTokenGenerator

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_email_verified))

generate_token = TokenGenerator()

В render_to_string у меня есть такой файл

email_body.html

{% autoescape off %}


Hi {{mail}}

Please use the link below to verify your account.


http://{{domain}}{% url 'activate' uidb64=uid token=token %}


{% endautoescape %}

Когда пользователь нажимает на это письмо, он переходит на сайт, который запускает другую функцию: urls.py

from django.urls import path

from .views import (
    Login,
    PersonalRegister,
    logout_user,
    activate_user
)
urlpatterns = [
    path('login/', Login.as_view(), name='login'),
    path('register/', PersonalRegister.as_view(), name='register'),
    path('logout/', logout_user, name='logout'),
    path('activate-user/<uidb64>/<token>/', activate_user, name='activate')
]

функция

def activate_user(request, uidb64, token):

    try:
        uid = force_str(urlsafe_b64decode(uidb64))

        user = models.PersonalUser.objects.get(pk=uid)

    except Exception as e:
        user = None

    if user and generate_token.check_token(user, token):
        user.is_email_verified = True
        user.save()

        messages.add_message(request, messages.SUCCESS,
                             'Email verified, you can now login')
        return redirect(reverse('login'))

    return render(request, 'authentication/email/activate-failed.html', {"user": user})

activate-failed.html

<p>Someone went wrong with your link</p>

Я хочу запустить функцию if в моей функции activate_user, чтобы она проверяла электронную почту пользователя.

Вы переопределили процедуру _make_hash_value(). Вероятно, вам также потребуется переопределить процедуру check_token() в django.contrib.auth.tokens, чтобы учесть ваши изменения. Проверьте, где происходит разделение в этой функции, чтобы убедиться, что она получает значение метки времени.

Вернуться на верх