diff --git a/rest_framework/compat.py b/rest_framework/compat.py index 9ad8b0d28..bcea7b587 100644 --- a/rest_framework/compat.py +++ b/rest_framework/compat.py @@ -603,3 +603,20 @@ except ImportError: klass.__unicode__ = klass.__str__ klass.__str__ = lambda self: self.__unicode__().encode('utf-8') return klass + + +from django.template.response import SimpleTemplateResponse as _SimpleTemplateResponse +if django.VERSION >= (1, 4): + SimpleTemplateResponse = _SimpleTemplateResponse +else: + class SimpleTemplateResponse(_SimpleTemplateResponse): + rendering_attrs = [] + + def __getstate__(self): + state = super(SimpleTemplateResponse, self).__getstate__() + #apply the same logic django >= 1.4 implements + for key in self.rendering_attrs: + if key in state: + del state[key] + + return state diff --git a/rest_framework/response.py b/rest_framework/response.py index 1dc6abcf6..d3d1795de 100644 --- a/rest_framework/response.py +++ b/rest_framework/response.py @@ -6,8 +6,7 @@ The appropriate renderer is called during Django's template response rendering. """ from __future__ import unicode_literals from django.core.handlers.wsgi import STATUS_CODE_TEXT -from django.template.response import SimpleTemplateResponse -from rest_framework.compat import six +from rest_framework.compat import six, SimpleTemplateResponse class Response(SimpleTemplateResponse): @@ -15,6 +14,10 @@ class Response(SimpleTemplateResponse): An HttpResponse that allows its data to be rendered into arbitrary media types. """ + # SimpleTemplateResponse use this property in __getstate__ to remove attrs + # from being pickled so we inherit and use it as well + rendering_attrs = SimpleTemplateResponse.rendering_attrs + \ + ['accepted_renderer', 'renderer_context', 'data'] def __init__(self, data=None, status=200, template_name=None, headers=None, @@ -76,13 +79,3 @@ class Response(SimpleTemplateResponse): # TODO: Deprecate and use a template tag instead # TODO: Status code text for RFC 6585 status codes return STATUS_CODE_TEXT.get(self.status_code, '') - - def __getstate__(self): - """ - Remove attributes from the response that shouldn't be cached - """ - state = super(Response, self).__getstate__() - for key in ('accepted_renderer', 'renderer_context', 'data'): - if key in state: - del state[key] - return state