From 34b077d312077b236819bc7f46448181cee2933a Mon Sep 17 00:00:00 2001 From: Carlton Gibson Date: Thu, 31 Jan 2019 14:36:13 +0100 Subject: [PATCH] Fixed SchemaView to reset renderer on exception. Fixes #6258. --- rest_framework/schemas/views.py | 8 ++++++++ tests/test_schemas.py | 10 ++++++++++ 2 files changed, 18 insertions(+) diff --git a/rest_framework/schemas/views.py b/rest_framework/schemas/views.py index 845b68ea6..f5e327a94 100644 --- a/rest_framework/schemas/views.py +++ b/rest_framework/schemas/views.py @@ -31,3 +31,11 @@ class SchemaView(APIView): if schema is None: raise exceptions.PermissionDenied() return Response(schema) + + def handle_exception(self, exc): + # Schema renderers do not render exceptions, so re-perform content + # negotiation with default renderers. + self.renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES + neg = self.perform_content_negotiation(self.request, force=True) + self.request.accepted_renderer, self.request.accepted_media_type = neg + return super(SchemaView, self).handle_exception(exc) diff --git a/tests/test_schemas.py b/tests/test_schemas.py index 8e097f9f4..d3bd43073 100644 --- a/tests/test_schemas.py +++ b/tests/test_schemas.py @@ -1304,3 +1304,13 @@ class TestAutoSchemaAllowsFilters(object): def test_FOO(self): assert not self._test('FOO') + + +@pytest.mark.skipif(not coreapi, reason='coreapi is not installed') +def test_schema_handles_exception(): + schema_view = get_schema_view(permission_classes=[DenyAllUsingPermissionDenied]) + request = factory.get('/') + response = schema_view(request) + response.render() + assert response.status_code == 403 + assert "You do not have permission to perform this action." in str(response.content)