Как сгенерировать представление подтверждения сброса пароля с помощью Django?
У меня есть приложение Django Rest Framework api. И я пытаюсь сгенерировать некоторый функционал для забытого пароля. На данный момент есть api вызов, доступный для сброса пароля. И пользователь получает письмо со ссылкой на сброс пароля.
Но проблема, с которой я столкнулся, заключается в том, что если пользователь нажимает на ссылку сброса электронной почты, это приводит к ошибке:
Page not found (404)
Request Method: GET
Request URL: http://127.0.0.1:8000/reset-password/MjE/cbr2cj-0d6c660c151de4e79594212801241fed/
Вот файл views.py с функцией
PasswordResetConfirmView
class PasswordResetConfirmView(generics.GenericAPIView):
serializer_class = PasswordResetConfirmSerializer
print("password rest")
def post(self, request, uidb64, token, *args, **kwargs):
try:
uid = urlsafe_base64_decode(uidb64).decode()
user = Account.objects.get(pk=uid)
print(user)
except (TypeError, ValueError, OverflowError, Account.DoesNotExist):
user = None
if user and default_token_generator.check_token(user, token):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save(user=user)
return Response({"message": "Password reset successful."}, status=status.HTTP_200_OK)
else:
return Response({"error": "Invalid token or user."}, status=status.HTTP_400_BAD_REQUEST)
И файл serializers.py:
class PasswordResetConfirmSerializer(serializers.Serializer):
new_password = serializers.CharField(write_only=True)
def validate_new_password(self, value):
validate_password(value)
return value
def save(self, user):
user.set_password(self.validated_data['new_password'])
user.save()
# Render the success email template
email_subject = 'Password Reset Successful'
email_body = render_to_string('password_reset_success_email.html', {
'user': user,
})
# Send success email to user
send_mail(
subject=email_subject,
message=email_body,
from_email='niels.fischereinie@gmail.com', # Change this to your "from" email
recipient_list=[user.email], # Send email to the user
html_message=email_body,
fail_silently=False
)
А модель счета выглядит так:
class MyAccountManager(BaseUserManager):
@allowed_users(allowed_roles=['account_permission'])
def create_user(self, email, password=None, **extra_field):
if not email:
raise ValueError("Gebruiker moet een email adres hebben.")
if not password:
raise ValueError("Gebruiker moet een password hebben.")
user = self.model(email=email, **extra_field)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, username, password):
user = self.create_user(
email=self.normalize_email(email),
username=username,
password=password,
)
user.is_admin = True
user.is_active = True
user.is_staff = True
user.is_superadmin = True
user.save(using=self._db)
return user
Основной файл urls.py:
from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import include, path
from drf_spectacular.views import (SpectacularAPIView, SpectacularSwaggerView)
from rest_framework.schemas import get_schema_view
urlpatterns = [
path('accounts/', include('accounts.urls', namespace='accounts')) ,
и аккаунтов urls.py:
from django.urls import path
from rest_framework.authtoken.views import obtain_auth_token
from accounts import views
from .views import PasswordResetRequestView, PasswordResetConfirmView, test_reverse_url
app_name='accounts'
urlpatterns = [
path('reset-password/', PasswordResetRequestView.as_view(), name='password_reset_request'),
path('reset-password/<uidb64>/<token>/', PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
]
Так что я не могу понять, почему выбрасывается ошибка 404 page not found.
Вопрос: Как устранить ошибку 404 "Страница не найдена"?