diff options
| -rw-r--r-- | CHANGES.txt | 8 | ||||
| -rw-r--r-- | pyramid/renderers.py | 18 | ||||
| -rw-r--r-- | pyramid/tests/test_renderers.py | 8 |
3 files changed, 33 insertions, 1 deletions
diff --git a/CHANGES.txt b/CHANGES.txt index 80578d539..7d06999d6 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -8,6 +8,14 @@ Backwards Incompatibilities have been deprecated since Pyramid 1.1, and as per the deprecation policy, have now been removed. +- ``request.response`` will no longer be mutated when using the + ``pyramid.renderers.render()`` API. Almost all renderers mutate the + ``request.response`` response object (for + example, the JSON renderer sets ``request.response.content_type`` to + ``application/json``), but this is only necessary when the renderer + is called by the view execution machinery; it was a bug when it was + done as a side effect of calling ``pyramid.renderers.render()``. + 1.5a1 (2013-08-30) ================== diff --git a/pyramid/renderers.py b/pyramid/renderers.py index a647d273c..d78335864 100644 --- a/pyramid/renderers.py +++ b/pyramid/renderers.py @@ -85,7 +85,23 @@ def render(renderer_name, value, request=None, package=None): package = caller_package() helper = RendererHelper(name=renderer_name, package=package, registry=registry) - return helper.render(value, None, request=request) + + saved_response = None + # save the current response, preventing the renderer from affecting it + attrs = request.__dict__ if request is not None else {} + if 'response' in attrs: + saved_response = attrs['response'] + del attrs['response'] + + result = helper.render(value, None, request=request) + + # restore the original response, overwriting any changes + if saved_response is not None: + attrs['response'] = saved_response + elif 'response' in attrs: + del attrs['response'] + + return result def render_to_response(renderer_name, value, request=None, package=None): """ Using the renderer ``renderer_name`` (a template diff --git a/pyramid/tests/test_renderers.py b/pyramid/tests/test_renderers.py index 078373f2e..13a1745a9 100644 --- a/pyramid/tests/test_renderers.py +++ b/pyramid/tests/test_renderers.py @@ -840,6 +840,14 @@ class Test_render(unittest.TestCase): renderer.assert_(a=1) renderer.assert_(request=request) + def test_it_preserves_response(self): + request = testing.DummyRequest() + response = object() # should error if mutated + request.response = response + result = self._callFUT('json', dict(a=1), request=request) + self.assertEqual(result, '{"a": 1}') + self.assertEqual(request.response, response) + class Test_render_to_response(unittest.TestCase): def setUp(self): self.config = testing.setUp() |
