summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Merickel <michael@merickel.org>2015-02-06 13:00:59 -0600
committerMichael Merickel <michael@merickel.org>2015-02-06 13:00:59 -0600
commit72bf6bb1b942a56a39d5ae33634e7aa8fac7080a (patch)
tree57dc9eefe4b58f28221f6a26051975bcd354f5b1
parente382164aa71731390f97db9734ce0b0bb014c78a (diff)
downloadpyramid-72bf6bb1b942a56a39d5ae33634e7aa8fac7080a.tar.gz
pyramid-72bf6bb1b942a56a39d5ae33634e7aa8fac7080a.tar.bz2
pyramid-72bf6bb1b942a56a39d5ae33634e7aa8fac7080a.zip
add a respones arg to render_to_response
-rw-r--r--pyramid/renderers.py14
-rw-r--r--pyramid/tests/test_renderers.py26
2 files changed, 34 insertions, 6 deletions
diff --git a/pyramid/renderers.py b/pyramid/renderers.py
index c4ea22429..088d451bb 100644
--- a/pyramid/renderers.py
+++ b/pyramid/renderers.py
@@ -79,7 +79,11 @@ def render(renderer_name, value, request=None, package=None):
return result
-def render_to_response(renderer_name, value, request=None, package=None):
+def render_to_response(renderer_name,
+ value,
+ request=None,
+ package=None,
+ response=None):
""" Using the renderer ``renderer_name`` (a template
or a static renderer), render the value (or set of values) using
the result of the renderer's ``__call__`` method (usually a string
@@ -112,12 +116,14 @@ def render_to_response(renderer_name, value, request=None, package=None):
with the most correct 'system' values (``request`` and ``context``
in particular). Keep in mind that any changes made to ``request.response``
prior to calling this function will not be reflected in the resulting
- response object. A new response object will be created for each call.
+ response object. A new response object will be created for each call
+ unless one is passed as the ``response`` argument.
.. versionchanged:: 1.6
In previous versions, any changes made to ``request.response`` outside
of this function call would affect the returned response. This is no
- longer the case.
+ longer the case. If you wish to send in a pre-initialized response
+ then you may pass one in the ``response`` argument.
"""
try:
@@ -130,6 +136,8 @@ def render_to_response(renderer_name, value, request=None, package=None):
registry=registry)
with temporary_response(request):
+ if response is not None:
+ request.response = response
result = helper.render_to_response(value, None, request=request)
return result
diff --git a/pyramid/tests/test_renderers.py b/pyramid/tests/test_renderers.py
index 31e9d14f8..ed6344a40 100644
--- a/pyramid/tests/test_renderers.py
+++ b/pyramid/tests/test_renderers.py
@@ -517,10 +517,11 @@ class Test_render_to_response(unittest.TestCase):
def tearDown(self):
testing.tearDown()
- def _callFUT(self, renderer_name, value, request=None, package=None):
+ def _callFUT(self, renderer_name, value, request=None, package=None,
+ response=None):
from pyramid.renderers import render_to_response
return render_to_response(renderer_name, value, request=request,
- package=package)
+ package=package, response=response)
def test_it_no_request(self):
renderer = self.config.testing_add_renderer(
@@ -579,6 +580,18 @@ class Test_render_to_response(unittest.TestCase):
self.assertEqual(result.body, b'{"a": 1}')
self.assertFalse('response' in request.__dict__)
+ def test_custom_response_object(self):
+ class DummyRequestWithClassResponse(object):
+ pass
+ request = DummyRequestWithClassResponse()
+ response = DummyResponse()
+ # use a json renderer, which will mutate the response
+ result = self._callFUT('json', dict(a=1), request=request,
+ response=response)
+ self.assertTrue(result is response)
+ self.assertEqual(result.body, b'{"a": 1}')
+ self.assertFalse('response' in request.__dict__)
+
class Test_get_renderer(unittest.TestCase):
def setUp(self):
self.config = testing.setUp()
@@ -639,7 +652,14 @@ class Dummy:
class DummyResponse:
status = '200 OK'
+ default_content_type = 'text/html'
+ content_type = default_content_type
headerlist = ()
app_iter = ()
- body = ''
+ body = b''
+
+ # compat for renderer that will set unicode on py3
+ def _set_text(self, val): # pragma: no cover
+ self.body = val.encode('utf8')
+ text = property(fset=_set_text)