aboutsummaryrefslogtreecommitdiffstats
path: root/djangorestframework
diff options
context:
space:
mode:
authorTom Christie2012-02-21 06:09:30 -0800
committerTom Christie2012-02-21 06:09:30 -0800
commit49ebaf106d4c4357f51f6b2bbe533512340ea113 (patch)
treeddb6cb637899a327253bffc2888e376eeab4e9f1 /djangorestframework
parent5a5f24f263c218f4f04a6ea54bfc48a2794e152b (diff)
parentf17f3886f42c2068e6e8a41c6e5fe6bfe1408add (diff)
downloaddjango-rest-framework-49ebaf106d4c4357f51f6b2bbe533512340ea113.tar.bz2
Merge pull request #175 from izquierdo/custom_reverse
Custom reverse() and drop set_script_prefix
Diffstat (limited to 'djangorestframework')
-rw-r--r--djangorestframework/resources.py6
-rw-r--r--djangorestframework/tests/reverse.py4
-rw-r--r--djangorestframework/utils/__init__.py21
-rw-r--r--djangorestframework/views.py10
4 files changed, 26 insertions, 15 deletions
diff --git a/djangorestframework/resources.py b/djangorestframework/resources.py
index cc338cc0..5e126def 100644
--- a/djangorestframework/resources.py
+++ b/djangorestframework/resources.py
@@ -1,10 +1,10 @@
from django import forms
-from django.core.urlresolvers import reverse, get_urlconf, get_resolver, NoReverseMatch
+from django.core.urlresolvers import get_urlconf, get_resolver, NoReverseMatch
from django.db import models
from djangorestframework.response import ErrorResponse
from djangorestframework.serializer import Serializer, _SkipField
-from djangorestframework.utils import as_tuple
+from djangorestframework.utils import as_tuple, reverse
class BaseResource(Serializer):
@@ -354,7 +354,7 @@ class ModelResource(FormResource):
instance_attrs[param] = attr
try:
- return reverse(self.view_callable[0], kwargs=instance_attrs)
+ return reverse(self.view_callable[0], self.view.request, kwargs=instance_attrs)
except NoReverseMatch:
pass
raise _SkipField
diff --git a/djangorestframework/tests/reverse.py b/djangorestframework/tests/reverse.py
index 2d1ca79e..3ac04d8c 100644
--- a/djangorestframework/tests/reverse.py
+++ b/djangorestframework/tests/reverse.py
@@ -1,8 +1,8 @@
from django.conf.urls.defaults import patterns, url
-from django.core.urlresolvers import reverse
from django.test import TestCase
from django.utils import simplejson as json
+from djangorestframework.utils import reverse
from djangorestframework.views import View
@@ -11,7 +11,7 @@ class MockView(View):
permissions = ()
def get(self, request):
- return reverse('another')
+ return reverse('another', request)
urlpatterns = patterns('',
url(r'^$', MockView.as_view()),
diff --git a/djangorestframework/utils/__init__.py b/djangorestframework/utils/__init__.py
index 634d0d68..fc8bae92 100644
--- a/djangorestframework/utils/__init__.py
+++ b/djangorestframework/utils/__init__.py
@@ -1,6 +1,7 @@
+import django
from django.utils.encoding import smart_unicode
from django.utils.xmlutils import SimplerXMLGenerator
-from django.core.urlresolvers import resolve
+from django.core.urlresolvers import resolve, reverse as django_reverse
from django.conf import settings
from djangorestframework.compat import StringIO
@@ -173,3 +174,21 @@ class XMLRenderer():
def dict2xml(input):
return XMLRenderer().dict2xml(input)
+
+
+def reverse(viewname, request, *args, **kwargs):
+ """
+ Do the same as :py:func:`django.core.urlresolvers.reverse` but using
+ *request* to build a fully qualified URL.
+ """
+ return request.build_absolute_uri(django_reverse(viewname, *args, **kwargs))
+
+if django.VERSION >= (1, 4):
+ from django.core.urlresolvers import reverse_lazy as django_reverse_lazy
+
+ def reverse_lazy(viewname, request, *args, **kwargs):
+ """
+ Do the same as :py:func:`django.core.urlresolvers.reverse_lazy` but using
+ *request* to build a fully qualified URL.
+ """
+ return request.build_absolute_uri(django_reverse_lazy(viewname, *args, **kwargs))
diff --git a/djangorestframework/views.py b/djangorestframework/views.py
index 32d2437c..3e8bf356 100644
--- a/djangorestframework/views.py
+++ b/djangorestframework/views.py
@@ -181,20 +181,12 @@ class View(ResourceMixin, RequestMixin, ResponseMixin, AuthMixin, DjangoView):
Required if you want to do things like set `request.upload_handlers` before
the authentication and dispatch handling is run.
"""
- # Calls to 'reverse' will not be fully qualified unless we set the
- # scheme/host/port here.
- self.orig_prefix = get_script_prefix()
- if not (self.orig_prefix.startswith('http:') or self.orig_prefix.startswith('https:')):
- prefix = '%s://%s' % (request.is_secure() and 'https' or 'http', request.get_host())
- set_script_prefix(prefix + self.orig_prefix)
+ return request
def final(self, request, response, *args, **kargs):
"""
Hook for any code that needs to run after everything else in the view.
"""
- # Restore script_prefix.
- set_script_prefix(self.orig_prefix)
-
# Always add these headers.
response.headers['Allow'] = ', '.join(self.allowed_methods)
# sample to allow caching using Vary http header