у меня есть 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 форматированное сообщение отправлялось по умолчанию в любом случае.