前回の記事でアカウント アプリの開発を開始しました。この記事はそれに基づいて構築します。カバーします
読者を飽きさせないように、できるだけ多くの詳細を説明するよう努めますが、Python と Django のいくつかの側面についてはよく知っていることを期待しています。
ソース コードの最終バージョンは https://github.com/saad4software/alive-diary-backend にあります
興味があれば過去の記事をチェックしてください!
パスワードを忘れた場合のリクエストはどのように機能しますか?プロセスは次の手順に従う必要があります
したがって、コード再送信 API と同じように、電子メール アドレスを取得し、アクティベーション コードを作成してユーザーに送信する API が必要です。
また、パスワードをリセットするために電子メール、アクティベーション コード、および新しいパスワードを取得する別の API も必要です。
コード API の再送信から始めるのは良いアイデアのように思えます。
いつものように、シリアライザーから始めましょう
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
これは汎用シリアライザーであり、ユーザー名というフィールドが 1 つあり、それが有効な電子メール アドレスであること、およびユーザーがシステムに登録されていることを確認します。
ここからはビューです
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
ビューはリクエストを検証することから始まり、次にユーザーを取得してそのコードインスタントを作成します。そして最後にコードを電子メールでユーザーに送信します。
そして最後に URL
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
これで swagger でテストできるようになりました
シリアライザーには、ユーザー名、送信されたコード、および新しいパスワードが含まれている必要があります。
のような、有効なユーザー名とコードであることを確認する必要があります。
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
すべてのフィールドは必須です。ユーザー名とコードの両方を一緒に検証するために validate 関数を使用しました。このユーザーにコード インスタントがない場合は検証エラーが発生し、送信されたコードがインスタント コード値と一致しない場合は、「invalid_code」検証エラーを発生させてユーザーに通知します。
ビューの場合、最初にシリアライザーを検証する必要があります
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
シリアライザーが有効でない場合は、シリアライザー エラーで API 例外を発生させます。有効な場合は、シリアライザー データを使用して検証インスタントをクエリします。このクエリは常に存在し、このクエリは既にシリアライザー チェックに合格しているため、送信されたコードは検証インスタント コード値と同じであることに注意してください。
次に、データベースから検証インスタンスを削除し、シリアライザーからの "new_password" 値でユーザー パスワードを更新します
最後に、URL ファイルを更新しましょう
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
ユーザー モデルのシリアライザーを作成することから始めましょう。次のようになります。
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
これはモデル シリアライザーです。ユーザー モデルを選択し、シリアル化するフィールドをリストしました。
ビューに移ると、ユーザーが GET リクエストでユーザーの詳細を取得し、POST リクエストでユーザーの詳細を更新できるビューが必要です。
のようになります。
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
とURL
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
それです!これを Swagger でテストしてみましょう。http://localhost:8555/swagger/ を開いてログインを使用すると、有効なトークンを取得できます。承認されたリクエストをテストするには、鍵をクリックする必要があります。アイコン、Swagger の任意のロック アイコン、およびトークンに「Bearer eyJhbGc...」のような「Bearer」プレフィックスを指定します
現在、詳細 API をテストしているため、次のようなアカウントの詳細が返されるはずです
それです!おめでとうございます。最小限の変更を加えるだけで、どの Django アプリでも使用できる、完全に機能するアカウント管理アプリが完成しました
他の機能が必要だと思いますか?提案してください!
次の記事ではメイン アプリに戻りますので、
乞うご期待?
以上がDjango アカウント管理アプリ (パスワードとアカウントの詳細を忘れた場合)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。