Wir haben in den vorherigen Artikeln mit der Arbeit an der Konten-App begonnen, dieser Artikel wird darauf aufbauen. Es wird abdecken
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
Schauen Sie sich bei Interesse frühere Artikel an!
Wie funktioniert die Anfrage zum Vergessen des Passworts? Der Prozess sollte den Schritten folgen
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.
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
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")
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()), ]
app_account/urls.py
Wir können es jetzt auf Swagger testen
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
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
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")
app_account/urls.py
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()), ]
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
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")
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...“
Jetzt sollte das Testen der Detail-API die Kontodetails wie gezeigt zurückgeben
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!