drf에 custom exception handler 적용하기

2023. 3. 18. 18:44

Django Exception Handling

Django에서는 exception을 어떻게 handling 하고 있을까?

공식 문서에서 살펴보면 detail에 에러 메시지를 return 하는 방식으로 error response를 주고 있다.

하지만 error response를 custom 하고 싶다면?

잘 알려진 jsend의 error response를 보자.

https://github.com/omniti-labs/jsend

 

GitHub - omniti-labs/jsend: JSend is a specification for a simple, no-frills, JSON based format for application-level communicat

JSend is a specification for a simple, no-frills, JSON based format for application-level communication. - GitHub - omniti-labs/jsend: JSend is a specification for a simple, no-frills, JSON based f...

github.com

Jsend error response 예시

이 방식으로 error response를 custom 하고 싶다면?

django 공식문서에서는 방법을 자세히 안내하고 있다.

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
REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'my_project.my_app.utils.custom_exception_handler'
}

custom exception handler를 작성하고, 이를 settings.py에 등록하면 끝!

출처:https://www.django-rest-framework.org/api-guide/exceptions/#custom-exception-handling

 

Exceptions - Django REST framework

 

www.django-rest-framework.org

 

Custom Exception Handler 적용하기

def custom_exception_handler(exc,context):
    response = exception_handler(exc,context)
    if response is not None:
        response.data['status'] = 'error'
        try:
            if (response.data['detail']) :
                response.data['message'] = response.data['detail']
                del response.data['detail']
                return response 
        except:
            return response
    else:
        STATUS_RSP_INTERNAL_ERROR['message'] = str(exc)
        return Response(STATUS_RSP_INTERNAL_ERROR, status=200)

위의 예시를 변형하여 실제 프로젝트에 적용한 코드이다.

FE와 정의한 통신 규칙에 따라 에러를 return 하고 있다.

손 쉽게 custom excpetion 적용 완료!

BELATED ARTICLES

more