summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Merickel <michael@merickel.org>2013-09-05 02:26:42 -0500
committerMichael Merickel <michael@merickel.org>2013-09-05 02:26:42 -0500
commit3803d92fc0da5282656d4229e063a1908ec5522a (patch)
treec3a1f09638f9d4441636bbf28c0a909caa2f0a93
parentc41c76bf713b636a19e97b319294ecf98885d1b5 (diff)
downloadpyramid-3803d92fc0da5282656d4229e063a1908ec5522a.tar.gz
pyramid-3803d92fc0da5282656d4229e063a1908ec5522a.tar.bz2
pyramid-3803d92fc0da5282656d4229e063a1908ec5522a.zip
update render() to preserve the original response object
-rw-r--r--CHANGES.txt12
-rw-r--r--pyramid/renderers.py18
-rw-r--r--pyramid/tests/test_renderers.py8
3 files changed, 37 insertions, 1 deletions
diff --git a/CHANGES.txt b/CHANGES.txt
index cdaad5a90..3c953e728 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,3 +1,15 @@
+Next Release
+============
+
+Backwards Incompatibilities
+---------------------------
+
+- Almost all renderers affect properties on the ``request.response`` response
+ object. For example, setting the content-type in the JSON renderer to
+ 'application/json'. These mutations will no longer affect
+ ``request.response`` when using the ``pyramid.renderers.render()`` API as
+ its only expected output is a rendered string object.
+
1.5a1 (2013-08-30)
==================
diff --git a/pyramid/renderers.py b/pyramid/renderers.py
index 602655be8..4b192f37d 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 befb714bd..e9d8dec68 100644
--- a/pyramid/tests/test_renderers.py
+++ b/pyramid/tests/test_renderers.py
@@ -897,6 +897,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()