aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework/versioning.py
diff options
context:
space:
mode:
authorTom Christie2014-12-16 16:14:08 +0000
committerTom Christie2014-12-16 16:14:08 +0000
commit4e91ec61339838426e246e20ef062c963a78c4e1 (patch)
tree9ab9de7b2c14d0da60efe0e9dbc6f359d07e4516 /rest_framework/versioning.py
parent7cfa0e0306456d4058f9d86f62a1b8f00e83dc41 (diff)
downloaddjango-rest-framework-4e91ec61339838426e246e20ef062c963a78c4e1.tar.bz2
Added NamespaceVersioning
Diffstat (limited to 'rest_framework/versioning.py')
-rw-r--r--rest_framework/versioning.py31
1 files changed, 29 insertions, 2 deletions
diff --git a/rest_framework/versioning.py b/rest_framework/versioning.py
index 2ca8efff..42df8b2c 100644
--- a/rest_framework/versioning.py
+++ b/rest_framework/versioning.py
@@ -1,6 +1,7 @@
# 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
)