diff --git a/rest_framework/tests/negotiation.py b/rest_framework/tests/negotiation.py index dd9f6a764..d8265b438 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 4dd0d208a..0359c2259 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