exception_handler: add codes for Http404 and PermissionDenied by blueyed · Pull Request #5379 · encode/django-rest-framework (original) (raw)

Yes, it is meant to provide a canonical response in case of errors.

We're also using a modified version of the first case because of this:

if isinstance(exc, exceptions.APIException):
    headers = {}
    if getattr(exc, 'auth_header', None):
        headers['WWW-Authenticate'] = exc.auth_header
    if getattr(exc, 'wait', None):
        headers['Retry-After'] = '%d' % exc.wait

    details = exc.get_full_details()
    if 'message' in details:
        data = {'detail': {'non_field_errors': [details]}}
    else:
        data = {'detail': details}

    set_rollback()
    return Response(data, status=exc.status_code, headers=headers)

So instead of

    if isinstance(exc.detail, (list, dict)):
        data = exc.detail
    else:
        data = {'detail': exc.detail}

we have

    details = exc.get_full_details()
    if 'message' in details:
        data = {'detail': {'non_field_errors': [details]}}
    else:
        data = {'detail': details}