Django - Возврат полной трассировки исключения на front-end при достижении 400

Для целей закрытого бета-тестирования и внутреннего тестирования я пытаюсь вернуть исключение с ошибкой 400 на моем сервере Django. Ниже приведен пример того, как я делаю это в коде Django. У меня есть партнер, работающий над front-end, и они сказали, что не могут получить ошибку из ответа 400. Я предположил, что она должна быть в виде response.body['error']. Как я могу отправить ответ 400 с полной трассировкой ошибки таким образом, чтобы ее можно было извлечь из внешнего интерфейса?

except Exception as e:
    return Response(dict(error=str(e),
                         user_message=error_message_generic),
                    status=status.HTTP_400_BAD_REQUEST)

Наиболее распространенный подход заключается в следующем:

from django.http import JsonResponse, HttpResponseBadRequest

return HttpResponseBadRequest(JsonResponse({
    "error": "Malformed request",
    # Any other fields you'd want
}))

Смотрите больше на официальном сайте docs.

Если вы заинтересованы в возврате именно трассировки исключения на заднем плане, вы можете пойти следующим путем:


from django.http import JsonResponse, HttpResponseBadRequest
import traceback

...
except Exception as e:
    return HttpResponseBadRequest(JsonResponse({
        "error": "Malformed request",
        "traceback": traceback.format_exc()
    }))

traceback.format_exc()

Но это не лучший способ сделать это во всех случаях. Если вы уверены, что исключение связано с вводом пользователя, то отслеживание не будет столь полезным для пользователя. Лучше использовать Serializer, чья валидация будет намного лучше. Если вы просто передаете информацию о неизвестной ошибке, я бы посоветовал использовать HttpResponseServerError и записывать исключения куда угодно, например, в sentry.

Вернуться на верх