added support for absolute/relative url switch

This commit is contained in:
Stephan Groß 2012-11-08 17:03:06 +01:00
parent 066d51faa1
commit 0bf37761fc
5 changed files with 33 additions and 8 deletions

View File

@ -150,4 +150,8 @@ Default: `'accept'`
Default: `'format'` Default: `'format'`
## USE_ABSOLUTE_URLS
Default: `'True'`
[cite]: http://www.python.org/dev/peps/pep-0020/ [cite]: http://www.python.org/dev/peps/pep-0020/

View File

@ -4,6 +4,10 @@
> >
> — Eric S. Raymond, [The Cathedral and the Bazaar][cite]. > — Eric S. Raymond, [The Cathedral and the Bazaar][cite].
## Master
* Add support and settings option `USE_ABSOLUTE_URLS`
## 2.1.1 ## 2.1.1
**Date**: 7th Nov 2012 **Date**: 7th Nov 2012

View File

@ -1,4 +1,6 @@
from rest_framework import serializers 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 # 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. Field that returns a link to the next page in paginated results.
""" """
page_field = 'page'
def to_native(self, value): def to_native(self, value):
if not value.has_next(): if not value.has_next():
return None return None
page = value.next_page_number() page = value.next_page_number()
request = self.context.get('request') request = self.context.get('request')
relative_url = '?page=%d' % page url = ''
if request: if request:
return request.build_absolute_uri(relative_url) if api_settings.USE_ABSOLUTE_URLS:
return relative_url url = request.build_absolute_uri()
else:
url = request.get_full_path()
return replace_query_param(url, self.page_field, page)
class PreviousPageField(serializers.Field): class PreviousPageField(serializers.Field):
""" """
Field that returns a link to the previous page in paginated results. Field that returns a link to the previous page in paginated results.
""" """
page_field = 'page'
def to_native(self, value): def to_native(self, value):
if not value.has_previous(): if not value.has_previous():
return None return None
page = value.previous_page_number() page = value.previous_page_number()
request = self.context.get('request') request = self.context.get('request')
relative_url = '?page=%d' % page url = ''
if request: if request:
return request.build_absolute_uri('?page=%d' % page) if api_settings.USE_ABSOLUTE_URLS:
return relative_url url = request.build_absolute_uri()
else:
url = request.get_full_path()
return replace_query_param(url, self.page_field, page)
class PaginationSerializerOptions(serializers.SerializerOptions): class PaginationSerializerOptions(serializers.SerializerOptions):

View File

@ -1,6 +1,7 @@
""" """
Provide reverse functions that return fully qualified URLs 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.core.urlresolvers import reverse as django_reverse
from django.utils.functional import lazy 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 = kwargs or {}
kwargs['format'] = format kwargs['format'] = format
url = django_reverse(viewname, args=args, kwargs=kwargs, **extra) 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 request.build_absolute_uri(url)
return url return url

View File

@ -65,7 +65,9 @@ DEFAULTS = {
'URL_ACCEPT_OVERRIDE': 'accept', 'URL_ACCEPT_OVERRIDE': 'accept',
'URL_FORMAT_OVERRIDE': 'format', 'URL_FORMAT_OVERRIDE': 'format',
'FORMAT_SUFFIX_KWARG': 'format' 'FORMAT_SUFFIX_KWARG': 'format',
'USE_ABSOLUTE_URLS': True
} }