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)