renderers.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. from rest_framework import renderers
  2. class PlainTextRenderer(renderers.BaseRenderer):
  3. # Disregard Accept header
  4. media_type = '*/*'
  5. format = 'txt'
  6. def render(self, data, media_type=None, renderer_context=None):
  7. renderer_context = renderer_context or {}
  8. response = renderer_context.get('response')
  9. if response and response.exception:
  10. response['Content-Type'] = 'text/plain'
  11. try:
  12. return data['detail']
  13. except (KeyError, TypeError):
  14. pass
  15. try:
  16. details = list(filter(None, [el.get('detail') for el in data]))
  17. if details:
  18. return ', '.join(details)
  19. except (TypeError, AttributeError):
  20. pass
  21. try:
  22. return '; '.join([f'{err.code}: {err}' for err in data])
  23. except (TypeError, AttributeError):
  24. pass
  25. raise ValueError('Expected response.data to be one of the following:\n'
  26. '- a dict with error details in response.data[\'detail\'],\n'
  27. '- a list with at least one element that has error details in element[\'detail\'];\n'
  28. '- a list with all elements being ErrorDetail instances;\n'
  29. 'but got %s:\n\n%s' % (type(response.data), response.data))
  30. return data