T.I.L May 9, 2023 (DRF 사용자 검증 기능 구현 중 발생한 오류)

2023. 5. 9. 09:50T.I.L (Today_I_Learned)

발생한 문제


def put(self, request, user_id):
        user = get_object_or_404(User, id=user_id)
        if request.user == user.user:
            serializer = UserDetailSerializer(user, data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_200_OK)
            else:
                return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
        else:
            return Response("권한이 없습니다", status=status.HTTP_403_FORBIDDEN)

최초 오류가 발생한 코드 입니다. 터미널에서는 AttributeError: 'User' object has no attribute 'user' 와 같은 오류가 

출력됐습니다.

 

 

해결 시도


오류 메시지가 알려준대로 확인해 보니 User 모델 안에 user에 해당하는 필드가 없음을 파악했습니다.

이제 User모델 안에 있는 필드중에 어떤것을 활용해서 대조를 해줘야 하는지 알아야 했습니다.

대조의 대상인 request.user 안에 어떠한 값이 있는지 확인해 봤습니다.

request.user는 user1@google.com 라는 이메일을 가지고 있었습니다.

User 모델에 email 필드를 활용하기 위해 if request.user == user.email: 와 같이 다시 작성해 줬습니다.

하지만 이번에는 '권한이 없습니다.' 라는 return을 받았습니다.

현재의 상황이라면 put요청을 하는 대상이 해당 유저로 로그인 된 상황이라서 정보의 수정이 진행됐어야 하지만

if를 통과하지 못한 것 같습니다.

이유를 알기 위해 다시 print(request.user, user.email)을 했습니다.

결과는 user1@google.com 로 동일 했습니다. 하지만 출력되는 값이 같은데 통과 되지 못했다는게 의아했습니다.

혹시 형식이 달라서 대조가 되지 못하는 것인가 하는 생각이 들어 두 필드의 type을 출력해 봤습니다.

결과는 request.user가 <class 'users.models.User'> user.email이 <class 'str'> 로 서로 달랐습니다.

 

 

해결


if str(request.user) == user.email:

문제의 코드 부분을 위와 같이 자료형을 일치시키는 방법으로 해결했습니다.