Fixed SchemaView to reset renderer on exception. (#6429)

Fixes #6258.
This commit is contained in:
Carlton Gibson 2019-01-31 15:28:01 +01:00 committed by GitHub
parent f54a220d8f
commit bd9a799e16
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 0 deletions

View File

@ -31,3 +31,11 @@ class SchemaView(APIView):
if schema is None: if schema is None:
raise exceptions.PermissionDenied() raise exceptions.PermissionDenied()
return Response(schema) 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)

View File

@ -1304,3 +1304,13 @@ class TestAutoSchemaAllowsFilters(object):
def test_FOO(self): def test_FOO(self):
assert not self._test('FOO') 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)