Как сгенерировать представление подтверждения сброса пароля с помощью 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 "Страница не найдена"?

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