Do not generate full schema in UI views

master
Cristi Vîjdea 2018-09-19 21:56:36 +03:00
parent cbae10c434
commit 207a7e2b2d
5 changed files with 18 additions and 15 deletions

View File

@ -17,6 +17,7 @@
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/testproj" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/testproj" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/.pytest_cache" /> <excludeFolder url="file://$MODULE_DIR$/.pytest_cache" />
<excludeFolder url="file://$MODULE_DIR$/build" />
<excludeFolder url="file://$MODULE_DIR$/dist" /> <excludeFolder url="file://$MODULE_DIR$/dist" />
<excludeFolder url="file://$MODULE_DIR$/docs/.doctrees" /> <excludeFolder url="file://$MODULE_DIR$/docs/.doctrees" />
<excludeFolder url="file://$MODULE_DIR$/docs/_build" /> <excludeFolder url="file://$MODULE_DIR$/docs/_build" />

View File

@ -28,7 +28,7 @@ class _SpecRenderer(BaseRenderer):
if not isinstance(data, Swagger): # pragma: no cover if not isinstance(data, Swagger): # pragma: no cover
# if `swagger` is not a ``Swagger`` object, it means we somehow got a non-success ``Response`` # if `swagger` is not a ``Swagger`` object, it means we somehow got a non-success ``Response``
# in that case, it's probably better to let the default ``TemplateHTMLRenderer`` render it # in that case, it's probably better to let the default ``JSONRenderer`` render it
# see https://github.com/axnsan12/drf-yasg/issues/58 # see https://github.com/axnsan12/drf-yasg/issues/58
return JSONRenderer().render(data, media_type, renderer_context) return JSONRenderer().render(data, media_type, renderer_context)
return codec.encode(data) return codec.encode(data)
@ -68,15 +68,11 @@ class _UIRenderer(BaseRenderer):
# see https://github.com/axnsan12/drf-yasg/issues/58 # see https://github.com/axnsan12/drf-yasg/issues/58
return TemplateHTMLRenderer().render(swagger, accepted_media_type, renderer_context) return TemplateHTMLRenderer().render(swagger, accepted_media_type, renderer_context)
self.set_context(renderer_context, swagger) self.set_context(renderer_context, swagger)
return render( return render(renderer_context['request'], self.template, renderer_context)
renderer_context['request'],
self.template,
renderer_context
)
def set_context(self, renderer_context, swagger): def set_context(self, renderer_context, swagger=None):
renderer_context['title'] = swagger.info.title renderer_context['title'] = swagger.info.title or '' if swagger else ''
renderer_context['version'] = swagger.info.version renderer_context['version'] = swagger.info.version or '' if swagger else ''
renderer_context['oauth2_config'] = json.dumps(self.get_oauth2_config()) renderer_context['oauth2_config'] = json.dumps(self.get_oauth2_config())
renderer_context['USE_SESSION_AUTH'] = swagger_settings.USE_SESSION_AUTH renderer_context['USE_SESSION_AUTH'] = swagger_settings.USE_SESSION_AUTH
renderer_context.update(self.get_auth_urls()) renderer_context.update(self.get_auth_urls())
@ -119,7 +115,7 @@ class SwaggerUIRenderer(_UIRenderer):
template = 'drf-yasg/swagger-ui.html' template = 'drf-yasg/swagger-ui.html'
format = 'swagger' format = 'swagger'
def set_context(self, renderer_context, swagger): def set_context(self, renderer_context, swagger=None):
super(SwaggerUIRenderer, self).set_context(renderer_context, swagger) super(SwaggerUIRenderer, self).set_context(renderer_context, swagger)
renderer_context['swagger_settings'] = json.dumps(self.get_swagger_ui_settings()) renderer_context['swagger_settings'] = json.dumps(self.get_swagger_ui_settings())
@ -152,7 +148,7 @@ class ReDocRenderer(_UIRenderer):
template = 'drf-yasg/redoc.html' template = 'drf-yasg/redoc.html'
format = 'redoc' format = 'redoc'
def set_context(self, renderer_context, swagger): def set_context(self, renderer_context, swagger=None):
super(ReDocRenderer, self).set_context(renderer_context, swagger) super(ReDocRenderer, self).set_context(renderer_context, swagger)
renderer_context['redoc_settings'] = json.dumps(self.get_redoc_settings()) renderer_context['redoc_settings'] = json.dumps(self.get_redoc_settings())

View File

@ -273,7 +273,7 @@ def merge_params(parameters, overrides):
def filter_none(obj): def filter_none(obj):
"""Remove ``None`` values from tuples, lists or dictionaries. Return other objects as-is. """Remove ``None`` values from tuples, lists or dictionaries. Return other objects as-is.
:param obj: :param obj: the object
:return: collection with ``None`` values removed :return: collection with ``None`` values removed
""" """
if obj is None: if obj is None:

View File

@ -12,7 +12,8 @@ from rest_framework.views import APIView
from .app_settings import swagger_settings from .app_settings import swagger_settings
from .renderers import ( from .renderers import (
OpenAPIRenderer, ReDocOldRenderer, ReDocRenderer, SwaggerJSONRenderer, SwaggerUIRenderer, SwaggerYAMLRenderer OpenAPIRenderer, ReDocOldRenderer, ReDocRenderer, SwaggerJSONRenderer, SwaggerUIRenderer, SwaggerYAMLRenderer,
_SpecRenderer
) )
SPEC_RENDERERS = (SwaggerYAMLRenderer, SwaggerJSONRenderer, OpenAPIRenderer) SPEC_RENDERERS = (SwaggerYAMLRenderer, SwaggerJSONRenderer, OpenAPIRenderer)
@ -85,7 +86,12 @@ def get_schema_view(info=None, url=None, patterns=None, urlconf=None, public=Fal
renderer_classes = _spec_renderers renderer_classes = _spec_renderers
def get(self, request, version='', format=None): def get(self, request, version='', format=None):
generator = self.generator_class(info, request.version or version or '', url, patterns, urlconf) version = request.version or version or ''
if isinstance(request.accepted_renderer, _SpecRenderer):
generator = self.generator_class(info, version, url, patterns, urlconf)
else:
generator = self.generator_class(info, version, url, patterns=[])
schema = generator.get_schema(request, self.public) schema = generator.get_schema(request, self.public)
if schema is None: if schema is None:
raise exceptions.PermissionDenied() # pragma: no cover raise exceptions.PermissionDenied() # pragma: no cover