From 75e5573865e8f8002b7fd68cce88282a39c87e25 Mon Sep 17 00:00:00 2001 From: Renato Rufino Date: Wed, 23 Jul 2014 01:05:52 -0300 Subject: [PATCH 1/5] adding support for rendering_attrs in SimpleTemplateResponse MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit __getstate__ method in django < 1.4 the implementation changed a bit in recent versions and it’s not hardcoded anymore its using the rendering_attrs to better support customising pickle --- rest_framework/compat.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/rest_framework/compat.py b/rest_framework/compat.py index fdf12448a..43cc3277b 100644 --- a/rest_framework/compat.py +++ b/rest_framework/compat.py @@ -600,3 +600,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 From dd09e94f41e365ef9c0614d1c73d5477a8a46e88 Mon Sep 17 00:00:00 2001 From: Renato Rufino Date: Wed, 23 Jul 2014 01:09:54 -0300 Subject: [PATCH 2/5] importing SimpleTemplateResponse from compat module to use the newer __getstate__ implementation using the rendering_attrs property --- rest_framework/response.py | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/rest_framework/response.py b/rest_framework/response.py index 1dc6abcf6..4d1a1311f 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,8 @@ class Response(SimpleTemplateResponse): An HttpResponse that allows its data to be rendered into arbitrary media types. """ + rendering_attrs = SimpleTemplateResponse.rendering_attrs + \ + ['accepted_renderer', 'renderer_context', 'data'] def __init__(self, data=None, status=200, template_name=None, headers=None, @@ -76,13 +77,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 From 409e687b2fb903d534422c8d9247f13f2b779f94 Mon Sep 17 00:00:00 2001 From: Renato Rufino Date: Wed, 23 Jul 2014 01:52:53 -0300 Subject: [PATCH 3/5] SimpleTemplateResponse compat should be >= 1.4 --- rest_framework/compat.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rest_framework/compat.py b/rest_framework/compat.py index 43cc3277b..8028e3a8b 100644 --- a/rest_framework/compat.py +++ b/rest_framework/compat.py @@ -603,7 +603,7 @@ except ImportError: from django.template.response import SimpleTemplateResponse as _SimpleTemplateResponse -if django.VERSION > (1, 4): +if django.VERSION >= (1, 4): SimpleTemplateResponse = _SimpleTemplateResponse else: class SimpleTemplateResponse(_SimpleTemplateResponse): @@ -611,7 +611,7 @@ else: def __getstate__(self): state = super(SimpleTemplateResponse, self).__getstate__() - #apply the same logic django > 1.4 implements + #apply the same logic django >= 1.4 implements for key in self.rendering_attrs: if key in state: del state[key] From f5a07603fe41cfbc68ee6b815cde0039c62286ad Mon Sep 17 00:00:00 2001 From: Renato Rufino Date: Thu, 24 Jul 2014 14:12:04 -0300 Subject: [PATCH 4/5] comments to clarify attribute usage in Response() --- rest_framework/response.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rest_framework/response.py b/rest_framework/response.py index 4d1a1311f..f8ad59020 100644 --- a/rest_framework/response.py +++ b/rest_framework/response.py @@ -14,6 +14,8 @@ 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'] From 0a4a935b5db0744da771e9e8147ac89f7a7510e8 Mon Sep 17 00:00:00 2001 From: Renato Rufino Date: Mon, 28 Jul 2014 19:57:03 -0300 Subject: [PATCH 5/5] pep8 fixes --- rest_framework/response.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rest_framework/response.py b/rest_framework/response.py index f8ad59020..d3d1795de 100644 --- a/rest_framework/response.py +++ b/rest_framework/response.py @@ -14,8 +14,8 @@ 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 + # 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']