Wir haben im vorherigen Artikel 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!
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()), ]
app_account/urls.py
Jetzt können Sie loslegen und die App mit
ausführen
python manage.py runserver 0.0.0.0:8555
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
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?
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
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]
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()), ]
app_account/urls.py
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()), ]
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!
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
app_account/serializers.py
Mach es noch einmal, mach es besser!
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer class LoginSerializer(TokenObtainPairSerializer): pass
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]
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()), ]
app_account/urls.py
Großartig! Beim Testen sollte etwa Folgendes zurückgegeben werden
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
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
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
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
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!