Skip to content

Commit 0bdd537

Browse files
akxcarltongibson
andauthored
Ignore derivations of BrowsableAPIRenderer in OpenAPI schema (encode#7497)
* Ignore derivations of BrowsableAPIRenderer in OpenAPI schema * Improve test_renderer_mapping test Co-authored-by: Carlton Gibson <carlton.gibson@noumenal.es>
1 parent eff97ef commit 0bdd537

File tree

2 files changed

+14
-5
lines changed

2 files changed

+14
-5
lines changed

rest_framework/schemas/openapi.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -595,7 +595,7 @@ def map_renderers(self, path, method):
595595
media_types = []
596596
for renderer in self.view.renderer_classes:
597597
# BrowsableAPIRenderer not relevant to OpenAPI spec
598-
if renderer == renderers.BrowsableAPIRenderer:
598+
if issubclass(renderer, renderers.BrowsableAPIRenderer):
599599
continue
600600
media_types.append(renderer.media_type)
601601
return media_types

tests/schemas/test_openapi.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010
from rest_framework.authtoken.views import obtain_auth_token
1111
from rest_framework.compat import uritemplate
1212
from rest_framework.parsers import JSONParser, MultiPartParser
13-
from rest_framework.renderers import JSONRenderer, OpenAPIRenderer
13+
from rest_framework.renderers import (
14+
BaseRenderer, BrowsableAPIRenderer, JSONRenderer, OpenAPIRenderer
15+
)
1416
from rest_framework.request import Request
1517
from rest_framework.schemas.openapi import AutoSchema, SchemaGenerator
1618

@@ -507,9 +509,16 @@ def test_renderer_mapping(self):
507509
path = '/{id}/'
508510
method = 'GET'
509511

512+
class CustomBrowsableAPIRenderer(BrowsableAPIRenderer):
513+
media_type = 'image/jpeg' # that's a wild API renderer
514+
515+
class TextRenderer(BaseRenderer):
516+
media_type = 'text/plain'
517+
format = 'text'
518+
510519
class View(generics.CreateAPIView):
511520
serializer_class = views.ExampleSerializer
512-
renderer_classes = [JSONRenderer]
521+
renderer_classes = [JSONRenderer, TextRenderer, BrowsableAPIRenderer, CustomBrowsableAPIRenderer]
513522

514523
view = create_view(
515524
View,
@@ -524,8 +533,8 @@ class View(generics.CreateAPIView):
524533
# schema support is there
525534
success_response = responses['200']
526535

527-
assert len(success_response['content'].keys()) == 1
528-
assert 'application/json' in success_response['content']
536+
# Check that the API renderers aren't included, but custom renderers are
537+
assert set(success_response['content']) == {'application/json', 'text/plain'}
529538

530539
def test_openapi_yaml_rendering_without_aliases(self):
531540
renderer = OpenAPIRenderer()

0 commit comments

Comments
 (0)