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
4e91ec61
Commit
4e91ec61
authored
Dec 16, 2014
by
Tom Christie
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added NamespaceVersioning
parent
7cfa0e03
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
94 additions
and
4 deletions
+94
-4
rest_framework/versioning.py
+29
-2
tests/test_versioning.py
+65
-2
No files found.
rest_framework/versioning.py
View file @
4e91ec61
# coding: utf-8
from
__future__
import
unicode_literals
from
rest_framework.reverse
import
_reverse
from
rest_framework.templatetags.rest_framework
import
replace_query_param
from
rest_framework.utils.mediatypes
import
_MediaType
import
re
...
...
@@ -30,7 +31,7 @@ class QueryParameterVersioning(BaseVersioning):
def
reverse
(
self
,
viewname
,
args
=
None
,
kwargs
=
None
,
request
=
None
,
format
=
None
,
**
extra
):
url
=
super
(
QueryParameterVersioning
,
self
)
.
reverse
(
viewname
,
args
,
kwargs
,
request
,
format
,
**
kwargs
viewname
,
args
,
kwargs
,
request
,
format
,
**
extra
)
if
request
.
version
is
not
None
:
return
replace_query_param
(
url
,
self
.
version_param
,
request
.
version
)
...
...
@@ -92,5 +93,31 @@ class URLPathVersioning(BaseVersioning):
kwargs
[
self
.
version_param
]
=
request
.
version
return
super
(
URLPathVersioning
,
self
)
.
reverse
(
viewname
,
args
,
kwargs
,
request
,
format
,
**
kwargs
viewname
,
args
,
kwargs
,
request
,
format
,
**
extra
)
class
NamespaceVersioning
(
BaseVersioning
):
"""
To the client this is the same style as `URLPathVersioning`.
The difference is in the backend - this implementation uses
Django's URL namespaces to determine the version.
GET /1.0/something/ HTTP/1.1
Host: example.com
Accept: application/json
"""
default_version
=
None
def
determine_version
(
self
,
request
,
*
args
,
**
kwargs
):
resolver_match
=
getattr
(
request
,
'resolver_match'
,
None
)
if
(
resolver_match
is
None
or
not
resolver_match
.
namespace
):
return
self
.
default_version
return
resolver_match
.
namespace
def
reverse
(
self
,
viewname
,
args
=
None
,
kwargs
=
None
,
request
=
None
,
format
=
None
,
**
extra
):
if
request
.
version
is
not
None
:
viewname
=
request
.
version
+
':'
+
viewname
return
super
(
NamespaceVersioning
,
self
)
.
reverse
(
viewname
,
args
,
kwargs
,
request
,
format
,
**
extra
)
tests/test_versioning.py
View file @
4e91ec61
from
django.conf.urls
import
url
from
django.conf.urls
import
include
,
url
from
rest_framework
import
versioning
from
rest_framework.decorators
import
APIView
from
rest_framework.response
import
Response
...
...
@@ -10,6 +10,7 @@ class RequestVersionView(APIView):
def
get
(
self
,
request
,
*
args
,
**
kwargs
):
return
Response
({
'version'
:
request
.
version
})
class
ReverseView
(
APIView
):
def
get
(
self
,
request
,
*
args
,
**
kwargs
):
return
Response
({
'url'
:
reverse
(
'another'
,
request
=
request
)})
...
...
@@ -19,8 +20,14 @@ factory = APIRequestFactory()
mock_view
=
lambda
request
:
None
included_patterns
=
[
url
(
r'^namespaced/$'
,
mock_view
,
name
=
'another'
),
]
urlpatterns
=
[
url
(
r'^another/$'
,
mock_view
,
name
=
'another'
)
url
(
r'^v1/'
,
include
(
included_patterns
,
namespace
=
'v1'
)),
url
(
r'^another/$'
,
mock_view
,
name
=
'another'
),
url
(
r'^(?P<version>[^/]+)/another/$'
,
mock_view
,
name
=
'another'
)
]
...
...
@@ -80,6 +87,22 @@ class TestRequestVersion:
response
=
view
(
request
)
assert
response
.
data
==
{
'version'
:
None
}
def
test_namespace_versioning
(
self
):
class
FakeResolverMatch
:
namespace
=
'v1'
scheme
=
versioning
.
NamespaceVersioning
view
=
RequestVersionView
.
as_view
(
versioning_class
=
scheme
)
request
=
factory
.
get
(
'/v1/endpoint/'
)
request
.
resolver_match
=
FakeResolverMatch
response
=
view
(
request
,
version
=
'v1'
)
assert
response
.
data
==
{
'version'
:
'v1'
}
request
=
factory
.
get
(
'/endpoint/'
)
response
=
view
(
request
)
assert
response
.
data
==
{
'version'
:
None
}
class
TestURLReversing
(
APITestCase
):
urls
=
'tests.test_versioning'
...
...
@@ -91,6 +114,18 @@ class TestURLReversing(APITestCase):
response
=
view
(
request
)
assert
response
.
data
==
{
'url'
:
'http://testserver/another/'
}
def
test_reverse_query_param_versioning
(
self
):
scheme
=
versioning
.
QueryParameterVersioning
view
=
ReverseView
.
as_view
(
versioning_class
=
scheme
)
request
=
factory
.
get
(
'/endpoint/?version=v1'
)
response
=
view
(
request
)
assert
response
.
data
==
{
'url'
:
'http://testserver/another/?version=v1'
}
request
=
factory
.
get
(
'/endpoint/'
)
response
=
view
(
request
)
assert
response
.
data
==
{
'url'
:
'http://testserver/another/'
}
def
test_reverse_host_name_versioning
(
self
):
scheme
=
versioning
.
HostNameVersioning
view
=
ReverseView
.
as_view
(
versioning_class
=
scheme
)
...
...
@@ -102,3 +137,31 @@ class TestURLReversing(APITestCase):
request
=
factory
.
get
(
'/endpoint/'
)
response
=
view
(
request
)
assert
response
.
data
==
{
'url'
:
'http://testserver/another/'
}
def
test_reverse_url_path_versioning
(
self
):
scheme
=
versioning
.
URLPathVersioning
view
=
ReverseView
.
as_view
(
versioning_class
=
scheme
)
request
=
factory
.
get
(
'/v1/endpoint/'
)
response
=
view
(
request
,
version
=
'v1'
)
assert
response
.
data
==
{
'url'
:
'http://testserver/v1/another/'
}
request
=
factory
.
get
(
'/endpoint/'
)
response
=
view
(
request
)
assert
response
.
data
==
{
'url'
:
'http://testserver/another/'
}
def
test_namespace_versioning
(
self
):
class
FakeResolverMatch
:
namespace
=
'v1'
scheme
=
versioning
.
NamespaceVersioning
view
=
ReverseView
.
as_view
(
versioning_class
=
scheme
)
request
=
factory
.
get
(
'/v1/endpoint/'
)
request
.
resolver_match
=
FakeResolverMatch
response
=
view
(
request
,
version
=
'v1'
)
assert
response
.
data
==
{
'url'
:
'http://testserver/v1/namespaced/'
}
request
=
factory
.
get
(
'/endpoint/'
)
response
=
view
(
request
)
assert
response
.
data
==
{
'url'
:
'http://testserver/another/'
}
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