From c10b04468cf1b562db54097051c7759c7c34bf2f Mon Sep 17 00:00:00 2001 From: Giacomello Nathan <0ddlyokoOfficial@gmail.com> Date: Mon, 2 Nov 2020 00:16:18 +0100 Subject: [PATCH] [IMP] core: some changes This commit: - changes print to logging - Only returns the error if there is one - Improves the render method --- pyrest/apps/core/exceptions.py | 36 +++++++++++++++++++--------------- pyrest/apps/core/renderers.py | 35 +++++++++++++++++---------------- 2 files changed, 38 insertions(+), 33 deletions(-) diff --git a/pyrest/apps/core/exceptions.py b/pyrest/apps/core/exceptions.py index bca423c..aaa65ff 100644 --- a/pyrest/apps/core/exceptions.py +++ b/pyrest/apps/core/exceptions.py @@ -1,7 +1,12 @@ +import logging + from django.core.exceptions import ObjectDoesNotExist, ValidationError from rest_framework import exceptions, views +logger = logging.getLogger(__name__) + + def exception_handler(exc, context): response = views.exception_handler(exc, context) if response is None: @@ -18,23 +23,22 @@ def exception_handler(exc, context): else: new_exc = exceptions.APIException('Unknown exception!') response = views.exception_handler(new_exc, context) - if response is not None: - if isinstance(response.data, list): - return response - response.data = make_response(response.data['detail'] if 'detail' in response.data else response.data, response.status_code) + if isinstance(response.data, list): + error_message = response.data + elif 'detail' in response.data: + error_message = response.data['detail'] + else: + error_message = response.data + response.data = { + 'exception': error_message, + } # Check if it's an error 500 + # TODO Find a better place to put this error if response.status_code >= 500: - print('Got error %d' % (response.status_code)) - print(response) - print('Original error:') - print(exc) + logger.error('Got error %d', response.status_code) + logger.error('Response:') + logger.error(response) + logger.error('Original error:') + logger.error(exc) return response - - -def make_response(error_message, status_code): - return { - 'error': True, - 'error_message': error_message, - 'status_code': status_code, - } diff --git a/pyrest/apps/core/renderers.py b/pyrest/apps/core/renderers.py index 666ee70..e71fbd2 100644 --- a/pyrest/apps/core/renderers.py +++ b/pyrest/apps/core/renderers.py @@ -12,26 +12,27 @@ class PyRestJSONRenderer(JSONRenderer): pagination_next_label = 'next' def render(self, data, media_type=None, renderer_context=None): - status_code = renderer_context['response'].status_code - response = { - 'code': status_code, - 'error': False, - 'error_message': None, - 'data': data, - } - print('Data:') - print(data) - if data.get('results', None) is not None: - return json.dumps({ + renderer_context = renderer_context or {} + + response = renderer_context['response'] + status_code = response.status_code + # If there is an error, show it + if response.exception: + dump = { + 'status_code': status_code, + 'error': data['exception'], + } + elif data.get('results', None) is not None: + dump = { + 'status_code': status_code, self.pagination_object_label: data['results'], self.pagination_count_label: data['count'], self.pagination_previous_label: data['previous'], self.pagination_next_label: data['next'], - }) - # If the view throws an error, 'data' will contain an 'errors' key - elif data.get('error', None) is not None and data['error']: - return super(PyRestJSONRenderer, self).render(data) + } else: - return json.dumps({ + dump = { + 'status_code': status_code, self.object_label: data, - }) + } + return json.dumps(dump)