Heim > Backend-Entwicklung > Python-Tutorial > Django-Kontoverwaltungs-App (Anmelden und Passwort ändern).

Django-Kontoverwaltungs-App (Anmelden und Passwort ändern).

DDD
Freigeben: 2024-11-26 06:24:09
Original
209 Leute haben es durchsucht

Was können Sie von diesem Artikel erwarten?

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

  • Serialisierer für Anmeldung, Aktualisierungstoken und Passwortänderungsanfragen
  • Ansichten für dieselben APIs, Anmeldung, Aktualisierungstoken und Kennwortänderung
  • 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-Kontoverwaltungs-App (1), Registrierung und Aktivierung
  5. Django-Kontenverwaltungs-App (2), anmelden und Passwort ändern (Sie sind hier?)

Melden Sie sich an und aktualisieren Sie APIs im Handumdrehen!

Wenn Sie es eilig haben und kein kompliziertes Benutzerverwaltungs- und Benutzerrollensystem haben, können Sie einfach den Anweisungen in der SimpleJWT-Dokumentation folgen. Sie müssen keine Serialisierer oder Ansichten erstellen, sondern nur die URLs bearbeiten Datei wie folgt

from django.urls import path, include
from .views import *
from rest_framework_simplejwt.views import (
    TokenObtainPairView,
    TokenRefreshView,
)

urlpatterns = [
    path('register/', AccountRegisterView.as_view()),
    path('activate/', AccountActivateView.as_view()),
    path('login/', TokenObtainPairView.as_view()),
    path('refresh/', TokenRefreshView.as_view()),
]
Nach dem Login kopieren
Nach dem Login kopieren

app_account/urls.py

Jetzt können Sie loslegen und die App mit
ausführen

python manage.py runserver 0.0.0.0:8555
Nach dem Login kopieren
Nach dem Login kopieren

Wenn Sie die URL http://localhost:8555/api/account/login/ öffnen, können Sie sich anmelden und mit http://localhost:8555/api/account/refresh/ können Sie die URL aktualisieren Token

Django accounts management app ( login and change password

Schön und einfach, aber was ist, wenn wir die Token-Antwort anpassen müssen? Eigentlich möchte ich, dass diese Antwort dem gleichen Antwortschema folgt, das wir im vorherigen Artikel erstellt haben, und außerdem das Rollenfeld für die Benutzeroberfläche erhält, um einen normalen Benutzer von einem Administrator zu unterscheiden. Wie geht das?

Passen Sie die Login-API an

Um Antworten zu erhalten, die unserem Schema folgen, können wir einfach einen leeren Serializer erstellen, der von TokenObtainPairSerializer erbt

from rest_framework_simplejwt.serializers import TokenObtainPairSerializer

class LoginSerializer(TokenObtainPairSerializer):
    pass
Nach dem Login kopieren
Nach dem Login kopieren

app_account/serializers.py

und übergeben Sie es an eine Anmeldeansicht, die unseren benutzerdefinierten Renderer verwendet

from rest_framework_simplejwt.views import TokenViewBase

class AccountLoginView(TokenViewBase):
    serializer_class = LoginSerializer
    renderer_classes = [CustomRenderer, BrowsableAPIRenderer]
Nach dem Login kopieren
Nach dem Login kopieren

app_account/views.py

Die Anmeldeantwort sollte jetzt unserem Schema folgen. Stellen Sie einfach sicher, dass Sie die URL-Datei so aktualisieren, dass sie auf unsere benutzerdefinierte Anmeldeansicht verweist

from django.urls import path, include
from .views import *
from rest_framework_simplejwt.views import (
    TokenObtainPairView,
    TokenRefreshView,
)

urlpatterns = [
    path('register/', AccountRegisterView.as_view()),
    path('activate/', AccountActivateView.as_view()),
    path('login/', AccountLoginView.as_view()),
    path('refresh/', TokenRefreshView.as_view()),
]

Nach dem Login kopieren
Nach dem Login kopieren

app_account/urls.py

Django accounts management app ( login and change password

Das Hinzufügen des Rollenfelds ist etwas knifflig. Der einfachste Weg wäre, die Validierungsfunktion im Serialisierer zu überschreiben, und mit Hilfe dieses einfachen JWT haben wir
erhalten

from django.urls import path, include
from .views import *
from rest_framework_simplejwt.views import (
    TokenObtainPairView,
    TokenRefreshView,
)

urlpatterns = [
    path('register/', AccountRegisterView.as_view()),
    path('activate/', AccountActivateView.as_view()),
    path('login/', TokenObtainPairView.as_view()),
    path('refresh/', TokenRefreshView.as_view()),
]
Nach dem Login kopieren
Nach dem Login kopieren

app_account/serializers.py

Wir haben damit begonnen, das Benutzerobjekt abzurufen. Wenn es nicht existiert oder das Passwort nicht übereinstimmt, wird ein Fehler mit der Meldung „invalid_credentials“ ausgegeben, dann stellen wir sicher, dass der Benutzer aktiv ist, und schließlich erhalten wir das Token und erstellen Sie die Antwort. Probieren wir es jetzt aus!

Django accounts management app ( login and change password

Ich weiß, es scheint zu viel Hektik für ein einfaches Ziel zu sein! aber es gibt uns die Kontrolle über das Validierungsverhalten und erlaubt uns, beliebige andere Felder hinzuzufügen. Fügen wir die Benutzerinformationen hinzu

python manage.py runserver 0.0.0.0:8555
Nach dem Login kopieren
Nach dem Login kopieren

app_account/serializers.py

Passen Sie die Aktualisierungstoken-API an

Mach es noch einmal, mach es besser!

from rest_framework_simplejwt.serializers import TokenObtainPairSerializer

class LoginSerializer(TokenObtainPairSerializer):
    pass
Nach dem Login kopieren
Nach dem Login kopieren

app_account/serializer.py

Dadurch erhalten wir neue Zugriffs- und Aktualisierungstoken sowie die Rollen- und Benutzerdaten. Wenn wir die zusätzlichen Felder nicht benötigen, können wir einfach eine leere Serializer-Klasse (mit Pass) verwenden, die von TokenRefreshSerializer erbt
Die Aktualisierungsansicht sollte so aussehen

from rest_framework_simplejwt.views import TokenViewBase

class AccountLoginView(TokenViewBase):
    serializer_class = LoginSerializer
    renderer_classes = [CustomRenderer, BrowsableAPIRenderer]
Nach dem Login kopieren
Nach dem Login kopieren

app_account/views.py

Es verwendet unseren neuen RefreshTokenSerializer und CustomRenderer. Vergessen Sie nicht, die URL-Datei zu aktualisieren

from django.urls import path, include
from .views import *
from rest_framework_simplejwt.views import (
    TokenObtainPairView,
    TokenRefreshView,
)

urlpatterns = [
    path('register/', AccountRegisterView.as_view()),
    path('activate/', AccountActivateView.as_view()),
    path('login/', AccountLoginView.as_view()),
    path('refresh/', TokenRefreshView.as_view()),
]

Nach dem Login kopieren
Nach dem Login kopieren

app_account/urls.py
Großartig! Beim Testen sollte etwa Folgendes zurückgegeben werden

Django accounts management app ( login and change password

Passwort-API ändern

Wie immer. Beginnen wir mit dem Serializer

from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from django.contrib.auth import get_user_model

class LoginSerializer(TokenObtainPairSerializer):

    def validate(self, attrs):
        username = attrs['username']
        user = get_user_model().objects.filter(username=username).first()

        if not user or not user.check_password(attrs['password']):
            raise serializers.ValidationError("invalid_credentials")

        if not user.is_active:
            raise serializers.ValidationError("not_active")

        refresh = self.get_token(user)

        data = {
            'refresh': str(refresh),
            'access': str(refresh.access_token),
            'role': user.role,
        }

        return data
Nach dem Login kopieren

app_account/serializers.py

Es handelt sich um einen benutzerdefinierten Serialisierer mit zwei erforderlichen Zeichenfeldern. Zur Ansicht wechseln

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = get_user_model()
        fields = (
            'first_name', 
            'last_name', 
            'username', 
            'country_code', 
            'expiration_date',
            'hobbies',
            'job',
            'bio',
            'role',
        )
        read_only_fields = ['username', 'role',  'expiration_date']


class LoginSerializer(TokenObtainPairSerializer):

    def validate(self, attrs):
        username = attrs['username']
        user = get_user_model().objects.filter(username=username).first()

        if not user or not user.check_password(attrs['password']):
            raise serializers.ValidationError("invalid_credentials")

        if not user.is_active:
            raise serializers.ValidationError("not_active")

        refresh = self.get_token(user)

        data = {
            'refresh': str(refresh),
            'access': str(refresh.access_token),
            'user': UserSerializer(user).data,
            'role': user.role,
        }

        return data

Nach dem Login kopieren

app_account/views.py

Diese Anfrage erfordert einen authentifizierten Benutzer, daher haben wir IsAuthenticated als Berechtigungsklasse verwendet, natürlich haben wir unsere benutzerdefinierte Renderer-Klasse verwendet. Bei der POST-Anfrage stellen wir zunächst sicher, dass die Anfrage die Serialisierungstypen erfüllt, und überprüfen dann die Gültigkeit des Passworts, falls gültig. wir ändern es und speichern das neue Benutzermodell

Das Öffnen von http://localhost:8555/api/account/password/ im Browser würde so aussehen

Django accounts management app ( login and change password

Da es sich um eine authentifizierte Ansicht handelt, ist die Verwendung eines Bearer-Tokens erforderlich, das vom BrowsableAPIRenderer nicht unterstützt wird.
Um dies (und jede authentifizierte Anfrage) zu testen, haben wir eine von zwei Möglichkeiten

  • Verwenden Sie eine IDE wie Postman oder Insomnia (ich persönlich bevorzuge Insomnia, da es mich immer noch nicht zum Anmelden zwingt)
  • Oder um Prahlerei zu verwenden

Wenn Sie den ersten Weg wählen, können Sie den nächsten Artikel ignorieren! Der nächste Artikel führt Sie durch die Implementierung von Swagger in Ihrem Django-Projekt

Bleiben Sie dran ?

Das obige ist der detaillierte Inhalt vonDjango-Kontoverwaltungs-App (Anmelden und Passwort ändern).. 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage