mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-06 21:40:13 +03:00
Extract APISchemaView and APIRootView out of the DefaultRouter.
This commit is contained in:
parent
abc62afddb
commit
632778448a
|
@ -275,6 +275,64 @@ class SimpleRouter(BaseRouter):
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
class APIRootView(views.APIView):
|
||||||
|
"""
|
||||||
|
The default basic root view for DefaultRouter
|
||||||
|
"""
|
||||||
|
_ignore_model_permissions = True
|
||||||
|
exclude_from_schema = True
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def as_view(cls, **initkwargs):
|
||||||
|
cls.api_root_dict = initkwargs.pop('api_root_dict', {})
|
||||||
|
return super(APIRootView, cls).as_view(**initkwargs)
|
||||||
|
|
||||||
|
def get(self, request, *args, **kwargs):
|
||||||
|
# Return a plain {"name": "hyperlink"} response.
|
||||||
|
ret = OrderedDict()
|
||||||
|
namespace = request.resolver_match.namespace
|
||||||
|
for key, url_name in self.api_root_dict.items():
|
||||||
|
if namespace:
|
||||||
|
url_name = namespace + ':' + url_name
|
||||||
|
try:
|
||||||
|
ret[key] = reverse(
|
||||||
|
url_name,
|
||||||
|
args=args,
|
||||||
|
kwargs=kwargs,
|
||||||
|
request=request,
|
||||||
|
format=kwargs.get('format', None)
|
||||||
|
)
|
||||||
|
except NoReverseMatch:
|
||||||
|
# Don't bail out if eg. no list routes exist, only detail routes.
|
||||||
|
continue
|
||||||
|
|
||||||
|
return Response(ret)
|
||||||
|
|
||||||
|
|
||||||
|
class APISchemaView(views.APIView):
|
||||||
|
"""
|
||||||
|
The default basic schema view for DefaultRouter
|
||||||
|
"""
|
||||||
|
_ignore_model_permissions = True
|
||||||
|
exclude_from_schema = True
|
||||||
|
renderer_classes = None
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def as_view(cls, **initkwargs):
|
||||||
|
cls.renderer_classes = initkwargs.pop(
|
||||||
|
'renderer_classes', cls.renderer_classes
|
||||||
|
)
|
||||||
|
cls.schema_generator = initkwargs.pop('schema_generator')
|
||||||
|
cls.api_root_dict = initkwargs.pop('api_root_dict')
|
||||||
|
return super(APIRootView, cls).as_view(**initkwargs)
|
||||||
|
|
||||||
|
def get(self, request, *args, **kwargs):
|
||||||
|
schema = self.schema_generator.get_schema(request)
|
||||||
|
if schema is None:
|
||||||
|
raise exceptions.PermissionDenied()
|
||||||
|
return Response(schema)
|
||||||
|
|
||||||
|
|
||||||
class DefaultRouter(SimpleRouter):
|
class DefaultRouter(SimpleRouter):
|
||||||
"""
|
"""
|
||||||
The default router extends the SimpleRouter, but also adds in a default
|
The default router extends the SimpleRouter, but also adds in a default
|
||||||
|
@ -284,6 +342,8 @@ class DefaultRouter(SimpleRouter):
|
||||||
include_format_suffixes = True
|
include_format_suffixes = True
|
||||||
root_view_name = 'api-root'
|
root_view_name = 'api-root'
|
||||||
default_schema_renderers = [renderers.CoreJSONRenderer, BrowsableAPIRenderer]
|
default_schema_renderers = [renderers.CoreJSONRenderer, BrowsableAPIRenderer]
|
||||||
|
APIRootView = APIRootView
|
||||||
|
APISchemaView = APISchemaView
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
if 'schema_title' in kwargs:
|
if 'schema_title' in kwargs:
|
||||||
|
@ -316,18 +376,10 @@ class DefaultRouter(SimpleRouter):
|
||||||
patterns=api_urls
|
patterns=api_urls
|
||||||
)
|
)
|
||||||
|
|
||||||
class APISchemaView(views.APIView):
|
return self.APISchemaView.as_view(
|
||||||
_ignore_model_permissions = True
|
renderer_classes=schema_renderers,
|
||||||
exclude_from_schema = True
|
schema_generator=schema_generator,
|
||||||
renderer_classes = schema_renderers
|
)
|
||||||
|
|
||||||
def get(self, request, *args, **kwargs):
|
|
||||||
schema = schema_generator.get_schema(request)
|
|
||||||
if schema is None:
|
|
||||||
raise exceptions.PermissionDenied()
|
|
||||||
return Response(schema)
|
|
||||||
|
|
||||||
return APISchemaView.as_view()
|
|
||||||
|
|
||||||
def get_api_root_view(self, api_urls=None):
|
def get_api_root_view(self, api_urls=None):
|
||||||
"""
|
"""
|
||||||
|
@ -338,32 +390,7 @@ class DefaultRouter(SimpleRouter):
|
||||||
for prefix, viewset, basename in self.registry:
|
for prefix, viewset, basename in self.registry:
|
||||||
api_root_dict[prefix] = list_name.format(basename=basename)
|
api_root_dict[prefix] = list_name.format(basename=basename)
|
||||||
|
|
||||||
class APIRootView(views.APIView):
|
return self.APIRootView.as_view(api_root_dict=api_root_dict)
|
||||||
_ignore_model_permissions = True
|
|
||||||
exclude_from_schema = True
|
|
||||||
|
|
||||||
def get(self, request, *args, **kwargs):
|
|
||||||
# Return a plain {"name": "hyperlink"} response.
|
|
||||||
ret = OrderedDict()
|
|
||||||
namespace = request.resolver_match.namespace
|
|
||||||
for key, url_name in api_root_dict.items():
|
|
||||||
if namespace:
|
|
||||||
url_name = namespace + ':' + url_name
|
|
||||||
try:
|
|
||||||
ret[key] = reverse(
|
|
||||||
url_name,
|
|
||||||
args=args,
|
|
||||||
kwargs=kwargs,
|
|
||||||
request=request,
|
|
||||||
format=kwargs.get('format', None)
|
|
||||||
)
|
|
||||||
except NoReverseMatch:
|
|
||||||
# Don't bail out if eg. no list routes exist, only detail routes.
|
|
||||||
continue
|
|
||||||
|
|
||||||
return Response(ret)
|
|
||||||
|
|
||||||
return APIRootView.as_view()
|
|
||||||
|
|
||||||
def get_urls(self):
|
def get_urls(self):
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Reference in New Issue
Block a user