diff options
| -rw-r--r-- | docs/api-guide/responses.md | 2 | ||||
| -rw-r--r-- | rest_framework/compat.py | 6 | ||||
| -rw-r--r-- | rest_framework/views.py | 11 | 
3 files changed, 13 insertions, 6 deletions
| diff --git a/docs/api-guide/responses.md b/docs/api-guide/responses.md index f83b8194..399b7c23 100644 --- a/docs/api-guide/responses.md +++ b/docs/api-guide/responses.md @@ -10,7 +10,7 @@ REST framework supports HTTP content negotiation by providing a `Response` class  The `Response` class subclasses Django's `SimpleTemplateResponse`.  `Response` objects are initialised with data, which should consist of native Python primitives.  REST framework then uses standard HTTP content negotiation to determine how it should render the final response content. -There's no requirement for you to use the `Response` class, you can also return regular `HttpResponse` objects from your views if you want, but it provides a nicer interface for returning Web API responses. +There's no requirement for you to use the `Response` class, you can also return regular `HttpResponse` or `StreamingHttpResponse` objects from your views if required.  Using the `Response` class simply provides a nicer interface for returning content-negotiated Web API responses, that can be rendered to multiple formats.  Unless you want to heavily customize REST framework for some reason, you should always use an `APIView` class or `@api_view` function for views that return `Response` objects.  Doing so ensures that the view can perform content negotiation and select the appropriate renderer for the response, before it is returned from the view. diff --git a/rest_framework/compat.py b/rest_framework/compat.py index 76dc0052..a19bd778 100644 --- a/rest_framework/compat.py +++ b/rest_framework/compat.py @@ -33,6 +33,12 @@ except ImportError:      from django.utils.encoding import force_unicode as force_text +# HttpResponseBase only exists from 1.5 onwards +try: +    from django.http.response import HttpResponseBase +except ImportError: +    from django.http import HttpResponse as HttpResponseBase +  # django-filter is optional  try:      import django_filters diff --git a/rest_framework/views.py b/rest_framework/views.py index c28d2835..37bba7f0 100644 --- a/rest_framework/views.py +++ b/rest_framework/views.py @@ -4,11 +4,11 @@ Provides an APIView class that is the base of all views in REST framework.  from __future__ import unicode_literals  from django.core.exceptions import PermissionDenied -from django.http import Http404, HttpResponse +from django.http import Http404  from django.utils.datastructures import SortedDict  from django.views.decorators.csrf import csrf_exempt  from rest_framework import status, exceptions -from rest_framework.compat import View +from rest_framework.compat import View, HttpResponseBase  from rest_framework.request import Request  from rest_framework.response import Response  from rest_framework.settings import api_settings @@ -244,9 +244,10 @@ class APIView(View):          Returns the final response object.          """          # Make the error obvious if a proper response is not returned -        assert isinstance(response, HttpResponse), ( -            'Expected a `Response` to be returned from the view, ' -            'but received a `%s`' % type(response) +        assert isinstance(response, HttpResponseBase), ( +            'Expected a `Response`, `HttpResponse` or `HttpStreamingResponse` ' +            'to be returned from the view, but received a `%s`' +            % type(response)          )          if isinstance(response, Response): | 
