aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework
diff options
context:
space:
mode:
Diffstat (limited to 'rest_framework')
-rw-r--r--rest_framework/tests/negotiation.py23
-rw-r--r--rest_framework/views.py16
2 files changed, 12 insertions, 27 deletions
diff --git a/rest_framework/tests/negotiation.py b/rest_framework/tests/negotiation.py
index dd9f6a76..d8265b43 100644
--- a/rest_framework/tests/negotiation.py
+++ b/rest_framework/tests/negotiation.py
@@ -1,8 +1,6 @@
from django.test import TestCase
from django.test.client import RequestFactory
-from rest_framework.decorators import api_view, renderer_classes
from rest_framework.negotiation import DefaultContentNegotiation
-from rest_framework.response import Response
factory = RequestFactory()
@@ -10,26 +8,14 @@ factory = RequestFactory()
class MockJSONRenderer(object):
media_type = 'application/json'
- def __init__(self, view):
- pass
-
class MockHTMLRenderer(object):
media_type = 'text/html'
- def __init__(self, view):
- pass
-
-
-@api_view(('GET',))
-@renderer_classes((MockJSONRenderer, MockHTMLRenderer))
-def example(request):
- return Response()
-
class TestAcceptedMediaType(TestCase):
def setUp(self):
- self.renderers = [MockJSONRenderer(None), MockHTMLRenderer(None)]
+ self.renderers = [MockJSONRenderer(), MockHTMLRenderer()]
self.negotiator = DefaultContentNegotiation()
def negotiate(self, request):
@@ -49,10 +35,3 @@ class TestAcceptedMediaType(TestCase):
request = factory.get('/', HTTP_ACCEPT='application/json; indent=8')
accepted_renderer, accepted_media_type = self.negotiate(request)
self.assertEquals(accepted_media_type, 'application/json; indent=8')
-
-
-class IntegrationTests(TestCase):
- def test_accepted_negotiation_set_on_request(self):
- request = factory.get('/', HTTP_ACCEPT='*/*')
- response = example(request)
- self.assertEquals(response.accepted_media_type, 'application/json')
diff --git a/rest_framework/views.py b/rest_framework/views.py
index 4dd0d208..0359c225 100644
--- a/rest_framework/views.py
+++ b/rest_framework/views.py
@@ -199,20 +199,26 @@ class APIView(View):
Runs anything that needs to occur prior to calling the method handlers.
"""
self.format = self.get_format_suffix(**kwargs)
+
if not self.has_permission(request):
self.permission_denied(request)
self.check_throttles(request)
- self.renderer, self.accepted_media_type = self.perform_content_negotiation(request)
+
+ # Perform content negotiation and store the accepted info on the request
+ neg = self.perform_content_negotiation(request)
+ request.accepted_renderer, request.accepted_media_type = neg
def finalize_response(self, request, response, *args, **kwargs):
"""
Returns the final response object.
"""
if isinstance(response, Response):
- if not getattr(self, 'renderer', None):
- self.renderer, self.accepted_media_type = self.perform_content_negotiation(request, force=True)
- response.accepted_renderer = self.renderer
- response.accepted_media_type = self.accepted_media_type
+ if not getattr(request, 'accepted_renderer', None):
+ neg = self.perform_content_negotiation(request, force=True)
+ request.accepted_renderer, request.accepted_media_type = neg
+
+ response.accepted_renderer = request.accepted_renderer
+ response.accepted_media_type = request.accepted_media_type
for key, value in self.headers.items():
response[key] = value