DRFを使用してプロジェクトを再編成(2)


ログイン機能
Logic
  • request.bodyでログイン情報(email,password)を受信します.
  • まず、電子メールがデータベースに存在するかどうかを確認し、電子メールが存在しない場合は、存在しないエラーメッセージをユーザーに送信し、応答します.
  • が存在する場合、ユーザインスタンスおよび要求.body情報を用いてLoginSerializerを生成する.
  • 有効性チェックが完了したらaccesstokenを使用して回答します.
  • DRF - Simple JWT
    user = User.objects.get(id=obj.id)
    refresh = RefreshToken.for_user(user)
    return str(refresh.access_token)
  • JWT(Json Web Token)を利用するため、DjangorestFramework Simple JWTをインストールして使用しました.
  • を利用すると,ユーザインスタンスを利用して容易にトークンを生成し,有効期間を設定するなど,トークンの管理を支援することができる.
  • SerializerMethodFieldの利用
    class LoginSerializer(serializers.ModelSerializer):
        access_token = serializers.SerializerMethodField()
        
    def get_access_token(self, obj):
        user = User.objects.get(id=obj.id)
        refresh = RefreshToken.for_user(user)
        return str(refresh.access_token)
  • アクセストークンを受信し、シーケンス化器に追加する方法を探したとき、SerializerMethodFieldが理解された.
  • に必要なフィールドのフィールドをカスタマイズできます.get(fieldname)設定関数を使用して値を設定できます.
  • Total Codes 🗂
  • github: https://github.com/gemma-Kim/Project-House-Of-Tomorrow
  • # views.py
    class Login(APIView):
        def post(self, request):
            try:
                user = User.objects.get(email=request.data['email'])
                serializer = LoginSerializer(user, data=request.data, partial=True)
                if serializer.is_valid(raise_exception=True):
                    return Response(data=serializer.data, status=400)
                return Response(data='INVALID_LOGIN_INFO', status=400)
            
            except User.DoesNotExist:
                return Response(data='사용자가 존재하지 않습니다.', status=400)
    
    # serializers.py
    class LoginSerializer(serializers.ModelSerializer):
        access_token = serializers.SerializerMethodField()
    
        class Meta:
            model = User
            fields = ('id', 'email', 'password', 'access_token')
            extra_kwargs = {
                'password': {'write_only': True},
                'email': {'write_only': True}
            }
        
        def validate_password(self, obj):
            email = self.initial_data['email']
            password = User.objects.get(email=email).password
            if check_password(obj, password):
                return password
            raise serializers.ValidationError('비밀번호가 올바르지 않습니다.')
    
        def get_access_token(self, obj):
            user = User.objects.get(id=obj.id)
            refresh = RefreshToken.for_user(user)
            return str(refresh.access_token)