T.I.L May 1, 2023 (DRF to do list 완료 날짜 수정 기능 구현 중 오류 해결)

2023. 5. 1. 22:43T.I.L (Today_I_Learned)

발생한 오류


# 문제의 코드
class ToDoCompleteView(APIView):
    def put(self, request, todo_id):
        todos = get_object_or_404(ToDoList, id=todo_id)
        if request.user == todos.user:
            serializer = ToDoSerializer(todos, data=request.data)
            if serializer.is_valid():
                if request.data.get('is_complete') == "true":
                    serializer.save(completion_at = datetime.datetime.now())
                    return Response(serializer.data, status=status.HTTP_200_OK)
            else:
                return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
                
# 발생한 오류
AssertionError: Expected a `Response`, `HttpResponse` or `HttpStreamingResponse` to be returned from the view, but received a `<class 'NoneType'>`
[02/May/2023 10:03:02] "PUT //todos/1/complete/ HTTP/1.1" 500 80237

 

 

 

시도한 것


우선 에러 메시지를 이해하기 위해 검색해 보았습니다. 에러 메시지에서 "but received a `<class 'NoneType'>" 이 부분은

`Response`, `HttpResponse`, `HttpStreamingResponse` 셋중에 하나의 객체가 아닌 None값이 반환됐다는 것 이었습니다.

결국 반환된 값이 없다는 메시지였습니다. 그래서 반환할 값이 선언된 부분을 다시 살펴보았습니다.

 

 

 

문제해결


문제는 "if request.data.get('is_complete') == "true":" 해당 분기문에 있었습니다. 'is_complete'의 값이 True이면 날짜를 수정하고 그 값을 저장해주는 로직이었는데 True에 해당하는 값 표기를 "true"의 형식으로 잘 못 기입해서 발생한 오류였습니다.

# 수정된 코드
class ToDoCompleteView(APIView):
    # permission_classes = [permissions.IsAuthenticated]
    def put(self, request, todo_id):
        todos = get_object_or_404(ToDoList, id=todo_id)
        if request.user == todos.user:
            serializer = ToDoSerializer(todos, data=request.data)
            if serializer.is_valid():
                if request.data.get('is_complete') == True:
                    serializer.save(completion_at = datetime.datetime.now())
                    return Response(serializer.data, status=status.HTTP_200_OK)
                else:
                    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
            else:
                return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

 

 

 

느낀점


아직 오타나 개인의 문법적 오류가 많아서 발생한 문제였습니다.

검수에 더 신경을 써야하겠고, 문법적 오류는 아직 문법적으로 이해나 공부가 부족하다고 판단됩니다.

이번 오류를 계기로 파이썬 문법을 빠르게 처음부터 다시 정리해 보며 상황에 맞는 올바른 문법 사용을 위해 노력해야겠습니다.