ホームページ >バックエンド開発 >Python チュートリアル >Django アカウント管理アプリ (ログインしてパスワードを変更)
前回の記事でアカウント アプリの開発を開始しました。この記事はそれに基づいて構築します。カバーします
読者を飽きさせないように、できるだけ多くの詳細を説明するよう努めますが、Python と Django のいくつかの側面についてはよく知っていることを期待しています。
ソース コードの最終バージョンは https://github.com/saad4software/alive-diary-backend にあります
興味があれば過去の記事をチェックしてください!
急いでいて、複雑なユーザー管理やユーザー ロール システムがない場合は、SimpleJWT ドキュメントの指示に従うだけで済みます。シリアライザーやビューを作成する必要はなく、URL を編集するだけです。次のようにファイルします
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
これで準備完了です。
を使用してアプリを実行します。
python manage.py runserver 0.0.0.0:8555
URL http://localhost:8555/api/account/login/ を開くとログインでき、http://localhost:8555/api/account/refresh/ を開くと更新できます。トークン
これは簡単で良いですが、トークンの応答をカスタマイズする必要がある場合はどうすればよいでしょうか?実際、この応答は前の記事で構築したのと同じ応答スキーマに従い、また、通常のユーザーと管理者を区別するために UI のロール フィールドを取得したいのですが、どうすればよいでしょうか?
スキーマに従う応答を取得するには、TokenObtainPairSerializer を継承する空のシリアライザーを作成するだけです
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer class LoginSerializer(TokenObtainPairSerializer): pass
app_account/serializers.py
カスタム レンダラーを使用するログイン ビューにそれを渡します
from rest_framework_simplejwt.views import TokenViewBase class AccountLoginView(TokenViewBase): serializer_class = LoginSerializer renderer_classes = [CustomRenderer, BrowsableAPIRenderer]
app_account/views.py
応答へのログインは、スキーマに従う必要があります。カスタム ログイン ビューを指すように URL ファイルを必ず更新してください
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
ロール フィールドの追加は少し難しいです。最も簡単な方法は、シリアライザーの検証関数を上書きすることです。単純な JWT の助けを借りて、次の結果を得ることができました。
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
まずユーザー オブジェクトを取得します。オブジェクトが存在しないか、パスワードが一致しない場合は、「invalid_credentials」メッセージでエラーが発生します。次に、ユーザーがアクティブであることを確認し、最後に、トークンを取得して応答を構築します。さっそく試してみましょう!
単純な目標にしては大忙しに思えるのはわかっています!ただし、検証動作を制御できるようになり、他のフィールドを追加できるようになります。ユーザー情報を追加しましょう
python manage.py runserver 0.0.0.0:8555
app_account/serializers.py
もう一度やりましょう!
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer class LoginSerializer(TokenObtainPairSerializer): pass
app_account/serializer.py
これにより、新しいアクセス トークンとリフレッシュ トークン、さらにロールとユーザー データが得られます。追加のフィールドが必要ない場合は、単に TokenRefreshSerializer を継承する空のシリアライザー クラス (パス付き) を使用できます
更新ビューは次のようになります
from rest_framework_simplejwt.views import TokenViewBase class AccountLoginView(TokenViewBase): serializer_class = LoginSerializer renderer_classes = [CustomRenderer, BrowsableAPIRenderer]
app_account/views.py
新しい RefreshTokenSerializer と CustomRenderer を使用します。URL ファイルを更新することを忘れないでください
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
素晴らしい!テストすると次のようなものが返されるはずです
いつものように。シリアライザーから始めましょう
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
これはカスタム シリアライザーであり、2 つの必須の char フィールドがあります。ビューに移動
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
このリクエストには認証されたユーザーが必要なので、アクセス許可クラスとして IsAuthenticated を使用しました。もちろん、カスタム レンダラー クラスを使用しました。 POST リクエストの場合、まずリクエストがシリアライザーのタイプを満たしていることを確認し、パスワードが有効である場合はその有効性をチェックします。それを変更して、新しいユーザー モデルを保存します
ブラウザで http://localhost:8555/api/account/password/ を開くと次のようになります
これは認証されたビューであるため、BrowsableAPIRenderer でサポートされていないベアラー トークンを使用する必要があります。
これ (およびすべての認証されたリクエスト) をテストするには、2 つのオプションのいずれかがあります
最初の道を選択した場合は、次の記事は無視してください。次の記事では、Django プロジェクトに Swagger を実装する手順を説明します
乞うご期待?
以上がDjango アカウント管理アプリ (ログインしてパスワードを変更)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。