TIL 240528

hyeo71·2024년 5월 28일
0

2024 내배캠 AI 트랙

목록 보기
103/108

Profile API

dj_rest_auth를 사용하면서 profile은 이전에 UserDetailSerializer를 상속하여 만든 CustomUserDetailSerializeraccounts/user에서 사용했지만 해당 serializer를 LoginSerializer가 같이 사용하는 것을 느꼈다.

Login을 하는 경우 access, refresh, user를 반환하는데 user모델의 필드를 전부 가져오기 때문에 로그인을 했을 때만 보여주고 싶은 user의 field(id, email, nickname)를 따로 구현하는 것이 쉽지 않았다.

LoginSerializer를 상속해서 이를 해결하려했지만 유저를 받아오는 과정에서 settings.py에서 설정한 USER_DETAILS_SERIALIZER를 사용하여 가져오는 듯하다.

{
    "access": "(access_token)",
    "refresh": "(refresh_token)",
    "user": {
        "id": 2,
        "email": "admin@test.com",
        "nickname": ""
      	"books": []
    }
}

고민하다가 결국 기존에 존재하는 accounst/user를 profile로 사용하지 않고 ProfileAPIView를 새로 구현하기로 했다.

class ProfileAPIView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        user = request.user
        if not user:
            return Response(
                {"message": "해당 유저는 존재하지 않습니다."},
                status=status.HTTP_400_BAD_REQUEST,
            )
        serializer = ProfileSerializer(user)
        return Response(serializer.data, status=status.HTTP_200_OK)

    def put(self, request):
        user = request.user
        serializer = ProfileSerializer(user, data=request.data, partial=True)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response(serializer.data, status=status.HTTP_200_OK)

    def delete(self, request, *args, **kwargs):
        user = self.request.user

        try:
            refresh_token = request.data.get("refresh_token")
            if refresh_token:
                token = RefreshToken(refresh_token)
                token.blacklist()
            else:
                return Response(
                    {"message": "refresh_token이 제공되지 않았습니다."},
                    status=status.HTTP_400_BAD_REQUEST,
                )
        except Exception as e:
            return Response(status=status.HTTP_400_BAD_REQUEST)

        try:
            # 사용자 비활성화
            # user.is_active=False
            # user.save()
            user.delete()
            return Response(status=status.HTTP_204_NO_CONTENT)
        except Exception as e:
            return Response(status=status.HTTP_400_BAD_REQUEST)

0개의 댓글