Я не могу проверить электронную почту пользователя в 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, чтобы учесть ваши изменения. Проверьте, где происходит разделение в этой функции, чтобы убедиться, что она получает значение метки времени.