Heim > Backend-Entwicklung > Python-Tutorial > Django-Kontoverwaltungs-App (Passwort und Kontodaten vergessen

Django-Kontoverwaltungs-App (Passwort und Kontodaten vergessen

Mary-Kate Olsen
Freigeben: 2024-11-25 20:17:10
Original
925 Leute haben es durchsucht

Was können Sie von diesem Artikel erwarten?

Wir haben in den vorherigen Artikeln mit der Arbeit an der Konten-App begonnen, dieser Artikel wird darauf aufbauen. Es wird abdecken

  • Serialisierer zum Vergessen von Passwörtern, zum erneuten Senden von Code und Kontodetails.
  • Ansichten für dieselben APIs.
  • Und natürlich die URLs.

Ich werde versuchen, so viele Details wie möglich abzudecken, ohne Sie zu langweilen, aber ich erwarte dennoch, dass Sie mit einigen Aspekten von Python und Django vertraut sind.

Die endgültige Version des Quellcodes finden Sie unter https://github.com/saad4software/alive-diary-backend

Serienbestellung

Schauen Sie sich bei Interesse frühere Artikel an!

  1. KI-Projekt von Grund auf, die Idee, lebendiges Tagebuch
  2. Beweisen Sie, dass es mit Google AI Studio machbar ist
  3. Django API-Projekt-Setup
  4. Django-Kontenverwaltung (1), Registrierung und Aktivierung
  5. Django-Kontenverwaltung (2), anmelden und Passwort ändern
  6. Django Rest-Framework mit Swagger
  7. Django-Kontenverwaltung (3) Passwort und Kontodaten vergessen (Sie sind hier?)

Wie funktioniert es?

Wie funktioniert die Anfrage zum Vergessen des Passworts? Der Prozess sollte den Schritten folgen

  • Benutzer hat offensichtlich sein Passwort vergessen?, dumm von mir.
  • Der Benutzer gibt seine/ihre E-Mail-Adresse ein.
  • Eine E-Mail mit einem Bestätigungscode wird an die E-Mail-Adresse gesendet.
  • Der Benutzer kann die E-Mail-Adresse und den Aktivierungscode verwenden, um ein neues Passwort festzulegen.

Wir benötigen also eine API, die die E-Mail-Adresse entgegennimmt, einen Aktivierungscode erstellt und ihn an den Benutzer sendet, genau wie die API zum erneuten Senden von Code.
Wir benötigen außerdem eine weitere API, die die E-Mail-Adresse, den Aktivierungscode und das neue Passwort benötigt, um das Passwort zurückzusetzen.
Mit der API zum erneuten Senden von Code zu beginnen, klingt jetzt nach einer guten Idee.

Code-API erneut senden

Beginnen wir wie immer mit dem Serializer

class SendCodeSerializer(serializers.Serializer):
    username = serializers.CharField(required=True)

    def validate_username(self, value):
        if not is_valid_email(value):
            raise serializers.ValidationError("invalid_email")

        verification_query = get_user_model().objects.filter(username=value).exists()
        if not verification_query:
            raise serializers.ValidationError("invalid_username")

        return value

Nach dem Login kopieren
Nach dem Login kopieren

app_account/serializers.py

Dies ist ein generischer Serialisierer mit einem Feld, dem Benutzernamen. Wir prüfen, ob es sich um eine gültige E-Mail-Adresse handelt und ob der Benutzer im System registriert ist.

Jetzt zu den Ansichten

class AccountSendCodeView(APIView):
    permission_classes = ()
    renderer_classes = [CustomRenderer, BrowsableAPIRenderer]


    @swagger_auto_schema(request_body=SendCodeSerializer)
    def post(self, request, *args, **kwargs):
        serializer = SendCodeSerializer(data=request.data)

        if not serializer.is_valid():
            raise APIException(serializer.errors)

        user = get_user_model().objects.filter(username=serializer.validated_data.get("username")).first()
        code = VerificationCode(user=user, email=user.username)
        code.save()

        send_mail(
            'Password Reset Code',
            'Your password reset code is ' + str(code.code),
            f'AliveDiary<{settings.EMAIL_SENDER}>',
            [user.username],
            fail_silently=False,
        )

        return Response("success")
Nach dem Login kopieren
Nach dem Login kopieren

app_account/views.py

Die Ansicht beginnt mit der Validierung der Anfrage, ruft dann den Benutzer ab und erstellt sofort einen Code dafür. und sendet schließlich den Code per E-Mail an den Benutzer.
Und schließlich die URLs

urlpatterns = [
    path('register/', AccountRegisterView.as_view()),
    path('activate/', AccountActivateView.as_view()),

    path('login/', AccountLoginView.as_view()),
    path('refresh/', AccountRefreshTokenView.as_view()),

    path('code/', AccountSendCodeView.as_view()), #new

    path('password/', AccountChangePasswordView.as_view()),
]
Nach dem Login kopieren
Nach dem Login kopieren

app_account/urls.py

Wir können es jetzt auf Swagger testen

Django accounts management app ( forgot password and account details

Passwort-API zurücksetzen

Der Serializer sollte den Benutzernamen, den gesendeten Code und das neue Passwort enthalten; Es sollte überprüft werden, ob es sich um einen gültigen Benutzernamen und Code handelt, etwa wie

class ForgotPasswordSerializer(serializers.Serializer):
    username = serializers.CharField(required=True)
    code = serializers.CharField(required=True)
    new_password = serializers.CharField(required=True)

    def validate(self, data):
        verification_query = VerificationCode.objects.filter(
            user__username=data['username'],
        ).order_by('-id')

        if not verification_query.exists():
            raise serializers.ValidationError("no_code")

        code = verification_query[0]
        if str(code.code) != str(data['code']):
            raise serializers.ValidationError("invalid_code")

        return data
Nach dem Login kopieren
Nach dem Login kopieren

app_account/serializers.py

Alle Felder sind Pflichtfelder. Wir haben die Validierungsfunktion verwendet, um Benutzername und Code gemeinsam zu validieren. Wenn für diesen Benutzer keine Code-Instants vorhanden sind, lösen wir einen Validierungsfehler aus. Wenn der gesendete Code nicht mit dem Instant-Codewert übereinstimmt, informieren wir den Benutzer, indem wir den Validierungsfehler „invalid_code“ auslösen.

Für die Ansicht müssen wir zunächst den Serializer validieren

class SendCodeSerializer(serializers.Serializer):
    username = serializers.CharField(required=True)

    def validate_username(self, value):
        if not is_valid_email(value):
            raise serializers.ValidationError("invalid_email")

        verification_query = get_user_model().objects.filter(username=value).exists()
        if not verification_query:
            raise serializers.ValidationError("invalid_username")

        return value

Nach dem Login kopieren
Nach dem Login kopieren

app_account/views.py

Wenn der Serializer nicht gültig ist, lösen wir eine API-Ausnahme mit den Serializer-Fehlern aus. Wenn er gültig ist, fragen wir den Überprüfungszeitpunkt mithilfe der Serializer-Daten ab. Beachten Sie, dass diese Abfrage immer vorhanden ist und der gesendete Code mit dem Wert des sofortigen Bestätigungscodes übereinstimmt, da diese Abfrage die Serialisierungsprüfung bereits bestanden hat.
Dann löschen wir die Verifizierungsinstanz aus der Datenbank und aktualisieren das Benutzerpasswort mit dem „new_password“-Wert aus dem Serializer

Lassen Sie uns abschließend die URL-Datei aktualisieren

class AccountSendCodeView(APIView):
    permission_classes = ()
    renderer_classes = [CustomRenderer, BrowsableAPIRenderer]


    @swagger_auto_schema(request_body=SendCodeSerializer)
    def post(self, request, *args, **kwargs):
        serializer = SendCodeSerializer(data=request.data)

        if not serializer.is_valid():
            raise APIException(serializer.errors)

        user = get_user_model().objects.filter(username=serializer.validated_data.get("username")).first()
        code = VerificationCode(user=user, email=user.username)
        code.save()

        send_mail(
            'Password Reset Code',
            'Your password reset code is ' + str(code.code),
            f'AliveDiary<{settings.EMAIL_SENDER}>',
            [user.username],
            fail_silently=False,
        )

        return Response("success")
Nach dem Login kopieren
Nach dem Login kopieren

app_account/urls.py

Die Kontodetails-API

Beginnen wir mit der Erstellung eines Serialisierers für das Benutzermodell, er würde so aussehen

urlpatterns = [
    path('register/', AccountRegisterView.as_view()),
    path('activate/', AccountActivateView.as_view()),

    path('login/', AccountLoginView.as_view()),
    path('refresh/', AccountRefreshTokenView.as_view()),

    path('code/', AccountSendCodeView.as_view()), #new

    path('password/', AccountChangePasswordView.as_view()),
]
Nach dem Login kopieren
Nach dem Login kopieren

app_account/serializers.py

Es handelt sich um einen Modellserialisierer. Wir haben das Benutzermodell ausgewählt und die zu serialisierenden Felder aufgelistet.

Wenn wir zur Ansicht übergehen, benötigen wir eine Ansicht, die es Benutzern ermöglicht, Benutzerdetails mit einer GET-Anfrage abzurufen und Benutzerdetails mit einer POST-Anfrage zu aktualisieren. Sie würde ungefähr so ​​aussehen

class ForgotPasswordSerializer(serializers.Serializer):
    username = serializers.CharField(required=True)
    code = serializers.CharField(required=True)
    new_password = serializers.CharField(required=True)

    def validate(self, data):
        verification_query = VerificationCode.objects.filter(
            user__username=data['username'],
        ).order_by('-id')

        if not verification_query.exists():
            raise serializers.ValidationError("no_code")

        code = verification_query[0]
        if str(code.code) != str(data['code']):
            raise serializers.ValidationError("invalid_code")

        return data
Nach dem Login kopieren
Nach dem Login kopieren

app_account/views.py

und die URLs

class AccountForgotPasswordView(APIView):
    permission_classes = ()
    renderer_classes = [CustomRenderer, BrowsableAPIRenderer]

    @swagger_auto_schema(request_body=ForgotPasswordSerializer)
    def post(self, request, *args, **kwargs):
        serializer = ForgotPasswordSerializer(data=request.data)
        if not serializer.is_valid():
            raise APIException(serializer.errors)

        verification_query = VerificationCode.objects.filter(
            user__username=serializer.validated_data.get('username'),
            code=serializer.validated_data.get('code')
        ).order_by('-id')

        verification_query.delete()

        user = get_user_model().objects.filter(
            username=serializer.validated_data.get('username'),
        ).first()
        user.set_password(serializer.validated_data.get('new_password'))
        user.save()
        return Response("success")
Nach dem Login kopieren

app_account/urls.py

das ist es! Lassen Sie uns dies mit Swagger testen. Öffnen Sie http://localhost:8555/swagger/ und verwenden Sie den Login, um ein gültiges Token zu erhalten. Um autorisierte Anfragen zu testen, müssen wir auf das Schloss klicken? Symbol, ein beliebiges Schlosssymbol in Swagger, und versehen Sie das Token mit dem Präfix „Bearer“, etwa wie „Bearer eyJhbGc...“

Django accounts management app ( forgot password and account details

Jetzt sollte das Testen der Detail-API die Kontodetails wie gezeigt zurückgeben

Django accounts management app ( forgot password and account details

Das ist es! Herzlichen Glückwunsch, Sie haben eine voll funktionsfähige Kontoverwaltungs-App, die mit minimalen Änderungen in jeder Django-App verwendet werden kann

Glauben Sie, dass es andere Funktionalitäten erfordert? Bitte machen Sie einen Vorschlag!

Wir werden in unserem nächsten Artikel zur Haupt-App zurückkehren, also

Bleiben Sie dran ?

Das obige ist der detaillierte Inhalt vonDjango-Kontoverwaltungs-App (Passwort und Kontodaten vergessen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage