본문 바로가기

Python

TypeError: Object of type JsonResponse is not JSON serializable

장고를 사용하여 스타일쉐어 클론 프로젝트를 할 때 리팩토링을 하면서 냈던 에러다. 에러 메세지가 내가 예상하는 순서대로 나지 않는다는 걸 상기했다. 그리고 디버깅시 값 뿐만 아니라 타입도 찍어봐야 겠다는 생각을 하게 되었다.

 

응답에 정보를 담아 프론트로 보낼 때 JsonResponse로 보내는데, exception 처리 코드를 이리저리 붙여보고 가독성을 위해 리팩토링을 하다 이전에 테스트를 할 때는 나지 않았던 에러가 발생했다.

에러 메세지

JsonResponse 안에 들어있는 키-값 쌍 하나하나를 주석처리를 해보며 문제가 있는 라인을 찾았다.

get_current_user_id는 사용자가 로그인을 한 상태라면 users 테이블 상의 id를, 아니라면 0을 반환하는 함수다. 에러가 났을 당시에는 바로 찾지 못했지만, 이 목적만 봐도 아래 코드에서 틀린 점을 찾을 수 있다. exception 처리 코드를 여기저기 옮기다가 실수로 잘못 붙여넣은 게 하나 보인다.

처음 이 에러가 발생했을 때 이 함수가 int를 반환할 거라는 인식 때문에 에러의 원인을 찾지 못했다. 그리고 이 함수의 return이 int가 맞는지 확인해보라는 조언을 듣고 나서 type을 확인해보니 <class ‘django.http.response.JsonResponse’>가 나왔다. 이걸 보고 함수에서 에러가 났다는 걸 알았다. 파이썬 내장 모듈인 json은 파이썬 native 타입(딕셔너리, 리스트, 문자열, 숫자, None 등)만 json으로 변환할 수 있다. 참고 링크

함수의 목적에 맞게 KeyError 부분을 지우고 나니 해결되었다.

 

1. 함수를 거치고 나서 JsonResponse를 한다면 함수에서 에러가 났을 때 바로 에러를 뱉을 거라 생각했지만 아니었다.

2. JsonResponse에 담긴 함수가 에러를 토하는 경우를대비해 이 TypeError도 핸들링해야 겠다.

 

더 생각할 것

1. <class ‘django.http.response.JsonResponse’>는 instance라는 것에 대해 설명할 수 있도록 공부하기.

'Python' 카테고리의 다른 글

Python - bcrypt, pyjwt  (1) 2021.02.07
Python - pyjwt v2.0.0 업데이트에 따른 이슈  (0) 2021.02.02
Python - Import  (0) 2021.01.17
Python - list vs tuple, set vs dictionary  (0) 2021.01.15
Python - Dictionary  (0) 2021.01.15