Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
D
django-rest-framework
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
django-rest-framework
Commits
537df7a6
Commit
537df7a6
authored
Mar 07, 2017
by
Xavier Ordoquy
Committed by
Tom Christie
Mar 07, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Extract APISchemaView and APIRootView out of the DefaultRouter. (#4707)
parent
cf5d401a
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
78 additions
and
63 deletions
+78
-63
rest_framework/routers.py
+48
-43
rest_framework/schemas.py
+30
-20
No files found.
rest_framework/routers.py
View file @
537df7a6
...
@@ -22,12 +22,11 @@ from collections import OrderedDict, namedtuple
...
@@ -22,12 +22,11 @@ from collections import OrderedDict, namedtuple
from
django.conf.urls
import
url
from
django.conf.urls
import
url
from
django.core.exceptions
import
ImproperlyConfigured
from
django.core.exceptions
import
ImproperlyConfigured
from
rest_framework
import
exceptions
,
renderers
,
views
from
rest_framework
import
views
from
rest_framework.compat
import
NoReverseMatch
from
rest_framework.compat
import
NoReverseMatch
from
rest_framework.renderers
import
BrowsableAPIRenderer
from
rest_framework.response
import
Response
from
rest_framework.response
import
Response
from
rest_framework.reverse
import
reverse
from
rest_framework.reverse
import
reverse
from
rest_framework.schemas
import
SchemaGenerator
from
rest_framework.schemas
import
SchemaGenerator
,
SchemaView
from
rest_framework.settings
import
api_settings
from
rest_framework.settings
import
api_settings
from
rest_framework.urlpatterns
import
format_suffix_patterns
from
rest_framework.urlpatterns
import
format_suffix_patterns
...
@@ -276,6 +275,36 @@ class SimpleRouter(BaseRouter):
...
@@ -276,6 +275,36 @@ 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
api_root_dict
=
None
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
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,7 +313,9 @@ class DefaultRouter(SimpleRouter):
...
@@ -284,7 +313,9 @@ class DefaultRouter(SimpleRouter):
include_root_view
=
True
include_root_view
=
True
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
=
None
APIRootView
=
APIRootView
APISchemaView
=
SchemaView
def
__init__
(
self
,
*
args
,
**
kwargs
):
def
__init__
(
self
,
*
args
,
**
kwargs
):
if
'schema_title'
in
kwargs
:
if
'schema_title'
in
kwargs
:
...
@@ -300,6 +331,14 @@ class DefaultRouter(SimpleRouter):
...
@@ -300,6 +331,14 @@ class DefaultRouter(SimpleRouter):
self
.
schema_title
=
kwargs
.
pop
(
'schema_title'
,
None
)
self
.
schema_title
=
kwargs
.
pop
(
'schema_title'
,
None
)
self
.
schema_url
=
kwargs
.
pop
(
'schema_url'
,
None
)
self
.
schema_url
=
kwargs
.
pop
(
'schema_url'
,
None
)
self
.
schema_renderers
=
kwargs
.
pop
(
'schema_renderers'
,
self
.
default_schema_renderers
)
self
.
schema_renderers
=
kwargs
.
pop
(
'schema_renderers'
,
self
.
default_schema_renderers
)
if
self
.
default_schema_renderers
:
warnings
.
warn
(
"The 'DefaultRouter.default_schema_renderers' is pending "
"deprecation. You should override "
"'DefaultRouter.APISchemaView' instead."
,
PendingDeprecationWarning
)
if
'root_renderers'
in
kwargs
:
if
'root_renderers'
in
kwargs
:
self
.
root_renderers
=
kwargs
.
pop
(
'root_renderers'
)
self
.
root_renderers
=
kwargs
.
pop
(
'root_renderers'
)
else
:
else
:
...
@@ -310,25 +349,16 @@ class DefaultRouter(SimpleRouter):
...
@@ -310,25 +349,16 @@ class DefaultRouter(SimpleRouter):
"""
"""
Return a schema root view.
Return a schema root view.
"""
"""
schema_renderers
=
self
.
schema_renderers
schema_generator
=
SchemaGenerator
(
schema_generator
=
SchemaGenerator
(
title
=
self
.
schema_title
,
title
=
self
.
schema_title
,
url
=
self
.
schema_url
,
url
=
self
.
schema_url
,
patterns
=
api_urls
patterns
=
api_urls
)
)
class
APISchemaView
(
views
.
APIView
):
return
self
.
APISchemaView
.
as_view
(
_ignore_model_permissions
=
True
renderer_classes
=
self
.
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
):
"""
"""
...
@@ -339,32 +369,7 @@ class DefaultRouter(SimpleRouter):
...
@@ -339,32 +369,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
):
"""
"""
...
...
rest_framework/schemas.py
View file @
537df7a6
...
@@ -665,28 +665,38 @@ class SchemaGenerator(object):
...
@@ -665,28 +665,38 @@ class SchemaGenerator(object):
return
named_path_components
+
[
action
]
return
named_path_components
+
[
action
]
class
SchemaView
(
APIView
):
_ignore_model_permissions
=
True
exclude_from_schema
=
True
renderer_classes
=
None
schema_generator
=
None
public
=
False
def
__init__
(
self
,
*
args
,
**
kwargs
):
super
(
SchemaView
,
self
)
.
__init__
(
*
args
,
**
kwargs
)
if
self
.
renderer_classes
is
None
:
if
renderers
.
BrowsableAPIRenderer
in
api_settings
.
DEFAULT_RENDERER_CLASSES
:
self
.
renderer_classes
=
[
renderers
.
CoreJSONRenderer
,
renderers
.
BrowsableAPIRenderer
,
]
else
:
self
.
renderer_classes
=
[
renderers
.
CoreJSONRenderer
]
def
get
(
self
,
request
,
*
args
,
**
kwargs
):
schema
=
self
.
schema_generator
.
get_schema
(
request
,
self
.
public
)
if
schema
is
None
:
raise
exceptions
.
PermissionDenied
()
return
Response
(
schema
)
def
get_schema_view
(
title
=
None
,
url
=
None
,
description
=
None
,
urlconf
=
None
,
renderer_classes
=
None
,
public
=
False
):
def
get_schema_view
(
title
=
None
,
url
=
None
,
description
=
None
,
urlconf
=
None
,
renderer_classes
=
None
,
public
=
False
):
"""
"""
Return a schema view.
Return a schema view.
"""
"""
generator
=
SchemaGenerator
(
title
=
title
,
url
=
url
,
description
=
description
,
urlconf
=
urlconf
)
generator
=
SchemaGenerator
(
title
=
title
,
url
=
url
,
description
=
description
,
urlconf
=
urlconf
)
if
renderer_classes
is
None
:
return
SchemaView
.
as_view
(
if
renderers
.
BrowsableAPIRenderer
in
api_settings
.
DEFAULT_RENDERER_CLASSES
:
renderer_classes
=
renderer_classes
,
rclasses
=
[
renderers
.
CoreJSONRenderer
,
renderers
.
BrowsableAPIRenderer
]
schema_generator
=
generator
,
else
:
public
=
public
,
rclasses
=
[
renderers
.
CoreJSONRenderer
]
)
else
:
rclasses
=
renderer_classes
class
SchemaView
(
APIView
):
_ignore_model_permissions
=
True
exclude_from_schema
=
True
renderer_classes
=
rclasses
def
get
(
self
,
request
,
*
args
,
**
kwargs
):
schema
=
generator
.
get_schema
(
request
,
public
)
if
schema
is
None
:
raise
exceptions
.
PermissionDenied
()
return
Response
(
schema
)
return
SchemaView
.
as_view
()
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment