summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@plope.com>2013-09-05 23:59:45 -0400
committerChris McDonough <chrism@plope.com>2013-09-05 23:59:45 -0400
commit027c9809ca9377b3ae37a34e4ed997d8fdfddfb8 (patch)
tree4682cd488b8c78df6d4b4822e8af8499d6d4b5ac
parentef5596c5e3de01afd1405e87f06de1f9867b4c86 (diff)
parent3803d92fc0da5282656d4229e063a1908ec5522a (diff)
downloadpyramid-027c9809ca9377b3ae37a34e4ed997d8fdfddfb8.tar.gz
pyramid-027c9809ca9377b3ae37a34e4ed997d8fdfddfb8.tar.bz2
pyramid-027c9809ca9377b3ae37a34e4ed997d8fdfddfb8.zip
resolve conflicts, reword change entry a bit
-rw-r--r--CHANGES.txt8
-rw-r--r--pyramid/renderers.py18
-rw-r--r--pyramid/tests/test_renderers.py8
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()