@razielvamp

Как кастомизировать ошибки сервера (response'ы) в Django и Django Rest Framework?

у меня есть ViewSet:

...
from handlers import specific_exception_handler...
...

class SomeViewSet(GenericViewSet):
    """
    Some custom generic viewset
    """
    queryset = SomeModel.objects.all()
    serializer_class = SomeSerializer
    parser_classes = (ParserClassThatReadSpecificXML,)
    renderer_classes = (RendererClassThatConvertResponseIntoSpecificXML,)

    def get_exception_handler(self):
        return specific_exception_handler_function_that_return_specific_xml_format_error

    @action(methods=['post'], detail=False, url_path='some_url', url_name='some_url')
    def register(self, request, format=None):

        some_variable = request.data.get('some_value', None)

        if not some_variable:
            raise ValueError

        return Response(data=some_variable, content_type="text/xml; charset=shift_jis")


у меня есть render:

...
import xmltodict

class RendererClassThatConvertResponseIntoSpecificXML(BaseRenderer):
    media_type = 'text/xml'
    format = 'txt'
    charset = 'shift_jis'

    def render(self, data, media_type=None, renderer_context=None):
        # return data as non utf-8 xml string
        return xmltodict.unparse(data).encode("shift_jis")


у меня есть обработчик ошибок:

...
from rest_framework.views import exception_handler

def specific_exception_handler_function_that_return_specific_xml_format_error(exc, context):

    response = exception_handler(exc, context)

    if response is not None:
        status_code = response.status_code
    else:
        status_code = status.HTTP_500_INTERNAL_SERVER_ERROR

    specific_data_that_will_be_converted_into_xml_by_render = {'ERROR_STATUS': status_code}
    headers = {'Retry-After': '300'}

    return Response(data, content_type='text/xml; charset=shift_jis', status=status_code, headers=headers)


Проблема:

Если ошибка возникает внутри View, например ```raise ValueError```, то у клиента выводится сообщение об ошибке в XML формате. Собственно, что и требуется от кода, но
1. Если ошибка возникнет внутри render'а, то пользователю будет показано стандартное ```500 Server Error``` сообщение
2. Если я попытаюсь открыть URL за пределами View, то у клиента опять же отобразится стандартное ```404 Server Error``` сообщение

Мне необходимо, чтобы моё XML форматированное сообщение отправлялось по умолчанию в любом случае.
  • Вопрос задан
  • 89 просмотров
Пригласить эксперта
Ответы на вопрос 1
@bacon
500 статус это когда вы уже не можете ничего поделать с ошибкой и значит у вас XML будет всегда одинаковый на такую ошибку, просто создайте файл 500.html с этим xml и положите в пути шаблонов, с 404 аналогично. Но учитывайте, что в DEBUG = True, они не отдаются. https://docs.djangoproject.com/en/3.0/ref/views/#e... Ну или через переопределение https://docs.djangoproject.com/en/dev/topics/http/...

ЗЫ на уровне DRF тоже есть свои view https://www.django-rest-framework.org/api-guide/ex...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Junto Москва
от 80 000 до 120 000 ₽
Верфь Екатеринбург
от 70 000 до 140 000 ₽
Большая Тройка Москва
от 120 000 до 200 000 ₽
24 сент. 2020, в 02:31
700 руб./в час
24 сент. 2020, в 01:04
20000 руб./за проект
23 сент. 2020, в 23:49
500 руб./за проект