@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 форматированное сообщение отправлялось по умолчанию в любом случае.
  • Вопрос задан
  • 647 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы