diff --git a/docs/api-guide/settings.md b/docs/api-guide/settings.md index 4f87b30da..6444bffd4 100644 --- a/docs/api-guide/settings.md +++ b/docs/api-guide/settings.md @@ -150,4 +150,8 @@ Default: `'accept'` Default: `'format'` +## USE_ABSOLUTE_URLS + +Default: `'True'` + [cite]: http://www.python.org/dev/peps/pep-0020/ diff --git a/docs/topics/release-notes.md b/docs/topics/release-notes.md index ecb6c91a2..7e82dd471 100644 --- a/docs/topics/release-notes.md +++ b/docs/topics/release-notes.md @@ -4,6 +4,10 @@ > > — Eric S. Raymond, [The Cathedral and the Bazaar][cite]. +## Master + +* Add support and settings option `USE_ABSOLUTE_URLS` + ## 2.1.1 **Date**: 7th Nov 2012 diff --git a/rest_framework/pagination.py b/rest_framework/pagination.py index 131718fd7..6f7c2dc06 100644 --- a/rest_framework/pagination.py +++ b/rest_framework/pagination.py @@ -1,4 +1,6 @@ from rest_framework import serializers +from rest_framework.settings import api_settings +from rest_framework.templatetags.rest_framework import replace_query_param # TODO: Support URLconf kwarg-style paging @@ -7,30 +9,42 @@ class NextPageField(serializers.Field): """ Field that returns a link to the next page in paginated results. """ + page_field = 'page' + def to_native(self, value): if not value.has_next(): return None page = value.next_page_number() request = self.context.get('request') - relative_url = '?page=%d' % page + url = '' if request: - return request.build_absolute_uri(relative_url) - return relative_url + if api_settings.USE_ABSOLUTE_URLS: + url = request.build_absolute_uri() + else: + url = request.get_full_path() + + return replace_query_param(url, self.page_field, page) class PreviousPageField(serializers.Field): """ Field that returns a link to the previous page in paginated results. """ + page_field = 'page' + def to_native(self, value): if not value.has_previous(): return None page = value.previous_page_number() request = self.context.get('request') - relative_url = '?page=%d' % page + url = '' if request: - return request.build_absolute_uri('?page=%d' % page) - return relative_url + if api_settings.USE_ABSOLUTE_URLS: + url = request.build_absolute_uri() + else: + url = request.get_full_path() + + return replace_query_param(url, self.page_field, page) class PaginationSerializerOptions(serializers.SerializerOptions): diff --git a/rest_framework/reverse.py b/rest_framework/reverse.py index c9db02f06..af1109bc1 100644 --- a/rest_framework/reverse.py +++ b/rest_framework/reverse.py @@ -1,6 +1,7 @@ """ Provide reverse functions that return fully qualified URLs """ +from rest_framework.settings import api_settings from django.core.urlresolvers import reverse as django_reverse from django.utils.functional import lazy @@ -14,7 +15,7 @@ def reverse(viewname, args=None, kwargs=None, request=None, format=None, **extra kwargs = kwargs or {} kwargs['format'] = format url = django_reverse(viewname, args=args, kwargs=kwargs, **extra) - if request: + if request and api_settings.USE_ABSOLUTE_URLS: return request.build_absolute_uri(url) return url diff --git a/rest_framework/settings.py b/rest_framework/settings.py index 9c40a2144..900fc7acb 100644 --- a/rest_framework/settings.py +++ b/rest_framework/settings.py @@ -65,7 +65,9 @@ DEFAULTS = { 'URL_ACCEPT_OVERRIDE': 'accept', 'URL_FORMAT_OVERRIDE': 'format', - 'FORMAT_SUFFIX_KWARG': 'format' + 'FORMAT_SUFFIX_KWARG': 'format', + + 'USE_ABSOLUTE_URLS': True }