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.