dj_rest_auth를 사용하면서 profile은 이전에 UserDetailSerializer를 상속하여 만든 CustomUserDetailSerializer를 accounts/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)