[DRF] custom exceptionHandler을 만들어서 에러응답을 커스터마이징 하자
[1] Custom Exception Handling 이란
API의 에러 응답(error response) 스타일을 내맘대로 핸들링할 수 있는 것을 말합니다.
현재 장고는 아래와 같은 스타일의 에러응답을 내려주도록 되어있는데요
{
"detail": 장고의 에러메세지
}
에러 응답에 status_code 필드를 추가하는 등
에러 응답 스타일을 커스터마이징하고 싶은 니즈가 있을 수 있습니다-!!
이럴때 취할 수 있는 방법이 custom exception handler 만들기 입니다-!!
[2] Custom Exception Handler 만들기
우선 저는 플젝에 utils라는 파일을 하나 만들었구요
문서에 있는 코드를 복붙해서 넣었습니다.
from rest_framework.views import exception_handler
def custom_exception_handler(exc, context):
# Call REST framework's default exception handler first,
# to get the standard error response.
response = exception_handler(exc, context)
# Now add the HTTP status code to the response.
if response is not None:
response.data['status_code'] = response.status_code
return response
[3] Custom Exception Handler 쓰도록 프로젝트 설정
그 다음은 저의 프로젝트가 default exception handler가 아니라
방금만든 custom exception handler를 쓰도록 설정을 해줘야합니다.
문서에 보면 settings.py에 아래와 같은 설정을 안해주면
Rest framework에서 기본적으로 제공하는 exception handler (rest_framework.views.exception_handler) 를 쓰게 될 것이라고
합니다..!
설정에 가서 추가해줬습니다!!
그리고 다시 올바르지 않은 요청을 해서 에러를 일으켜볼게요-!!
status_code 필드가 추가 된 에러응답 스타일로 잘 나옵니다..!
[궁금 1] detail도 바꿀 수 있을까...?!?
이렇게 바꿔보면..!
바뀝니다.
[궁금 2] exception으로 에러메세지 지정해준 것도 바뀔까?!
장고에서 알아서 exception 해주는 것 말고
이렇게 제가 발생시킨 예외인데..!! (에러메세지도 명시적으로 지정해줌)
이렇게 된 상태이면
custom_exception_handler 에서 지정해준 값으로 나오게 됩니다.
그래서 "헤더값이 올바르지 않습니다" 가 아니라 "테스트입니다" 로 나왔어요.
Reference
www.django-rest-framework.org/api-guide/exceptions/#custom-exception-handling
Exceptions - Django REST framework
www.django-rest-framework.org