Lukasz Dynowski
Lukasz Dynowski

Reputation: 13700

How to throw custom exception with custom error code on fly in django rest framework and override default fields in exception response

I would like to know how can I throw custom exception in django rest framework, that contains custom error_code and custom message. I am not interested in APIException() since this function does not allow for setting error code on fly. Additionally, I would like to know how to change the details key json response of exception message.

Upvotes: 4

Views: 8525

Answers (3)

user1882644
user1882644

Reputation:

from rest_framework import exceptions

class ServiceUnavailableError(exceptions.APIException):
    status_code = status.HTTP_503_SERVICE_UNAVAILABLE
    default_detail = "Service unavailable."

# your views.py
raise ServiceUnavailableError("Override message.")

Upvotes: 3

Lukasz Dynowski
Lukasz Dynowski

Reputation: 13700

I found the solution for all of my questions

api_exceptions.py

from rest_framework.views import exception_handler
from rest_framework.exceptions import APIException

custom_exception_handler

def custom_exception_handler(exc, context):

    response = exception_handler(exc, context)

    if response is not None:
        response.data['status_code'] = response.status_code

        #replace detail key with message key by delete detail key
        response.data['message'] = response.data['detail']
        del response.data['detail']

    return response

CustomApiException

class CustomApiException(APIException):

    #public fields
    detail = None
    status_code = None

    # create constructor
    def __init__(self, status_code, message):
        #override public fields
        CustomApiException.status_code = status_code
        CustomApiException.detail = message

settings.py

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'utilities.helpers.api_exceptions.custom_exception_handler',
}

your_view.py

raise CustomApiException(333, "My custom message")

#json response
{
  "status_code": 333,
  "message": "My custom message"
}

Upvotes: 10

Gocht
Gocht

Reputation: 10256

You could use a simple function that return a dict:

def response_error_message(dic, message="An error occurred please try again later.", http_status=None):
    dic["status_code"] = http_status or status.HTTP_500_INTERNAL_SERVER_ERROR
    dic["object"] = message
    dic["success"] = False

And the call in your view:

...

responsedic = {}
response_error_message(response_dic, message='Custom message', http_status=Custom_http_status)
return Response(response_dic)

Upvotes: 1

Related Questions