From c2ee1b30337962c5e7d583c4f4714ffb7f5f561a Mon Sep 17 00:00:00 2001 From: Ian Cordasco Date: Thu, 6 Apr 2017 13:25:21 -0500 Subject: [PATCH] Use overridden settings exception handler Instead of using the api_settings exception handler, we use the overridden settings attribute to find the correct handler. Closes #5054 --- rest_framework/views.py | 2 +- tests/test_views.py | 26 +++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/rest_framework/views.py b/rest_framework/views.py index 92911e8df..2cb926ae4 100644 --- a/rest_framework/views.py +++ b/rest_framework/views.py @@ -290,7 +290,7 @@ class APIView(View): """ Returns the exception handler that this view uses. """ - return api_settings.EXCEPTION_HANDLER + return self.settings.EXCEPTION_HANDLER # API policy implementation methods diff --git a/tests/test_views.py b/tests/test_views.py index adafa1cd7..f0919e846 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -8,7 +8,7 @@ from django.test import TestCase from rest_framework import status from rest_framework.decorators import api_view from rest_framework.response import Response -from rest_framework.settings import api_settings +from rest_framework.settings import APISettings, api_settings from rest_framework.test import APIRequestFactory from rest_framework.views import APIView @@ -45,6 +45,19 @@ class ErrorView(APIView): raise Exception +def custom_handler(exc, context): + if isinstance(exc, SyntaxError): + return Response({'error': 'SyntaxError'}, status=400) + return Response({'error': 'UnknownError'}, status=500) + + +class OverridenSettingsView(APIView): + settings = APISettings({'EXCEPTION_HANDLER': custom_handler}) + + def get(self, request, *args, **kwargs): + raise SyntaxError('request is invalid syntax') + + @api_view(['GET']) def error_view(request): raise Exception @@ -118,3 +131,14 @@ class TestCustomExceptionHandler(TestCase): expected = 'Error!' assert response.status_code == status.HTTP_400_BAD_REQUEST assert response.data == expected + + +class TestCustomSettings(TestCase): + def setUp(self): + self.view = OverridenSettingsView.as_view() + + def test_get_exception_handler(self): + request = factory.get('/', content_type='application/json') + response = self.view(request) + assert response.status_code == 400 + assert response.data == {'error': 'SyntaxError'}