티스토리 뷰

반응형

[1] Custom Exception Handling 이란 

 

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

 

반응형
댓글