summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Petrello <lists@ryanpetrello.com>2015-06-25 11:48:49 -0400
committerRyan Petrello <lists@ryanpetrello.com>2015-06-25 11:50:09 -0400
commit1fe3cec7466655a1f7ba636f53af796c6c132f47 (patch)
tree78e5ab6646944b828cf416af746d484487ede8e9
parent0001a9d94da76545991afbfb5274e8b8bacac888 (diff)
downloadpecan-1fe3cec7466655a1f7ba636f53af796c6c132f47.tar.gz
Fix a bug in the way `default_renderer` is applied.
When an explicit `content_type` is specified to `pecan.expose()`, it should always take precendece over the `default_renderer` specified at the application level. Fixes-bug: #1465688 Change-Id: I633777a3d682f17b7f61cbe691c6e93f2ce2a310
-rw-r--r--pecan/core.py8
-rw-r--r--pecan/decorators.py7
-rw-r--r--pecan/tests/test_base.py12
3 files changed, 22 insertions, 5 deletions
diff --git a/pecan/core.py b/pecan/core.py
index 14b9ad3..050687c 100644
--- a/pecan/core.py
+++ b/pecan/core.py
@@ -585,9 +585,11 @@ class PecanBase(object):
template = content_types.get(pecan_state['content_type'])
# check if for controller override of template
- template = pecan_state.get('override_template', template) or (
- 'json' if self.default_renderer == 'json' else None
- )
+ template = pecan_state.get('override_template', template)
+ if template is None and cfg['explicit_content_type'] is False:
+ if self.default_renderer == 'json':
+ template = 'json'
+
pecan_state['content_type'] = pecan_state.get(
'override_content_type',
pecan_state['content_type']
diff --git a/pecan/decorators.py b/pecan/decorators.py
index 68195a9..15808d4 100644
--- a/pecan/decorators.py
+++ b/pecan/decorators.py
@@ -23,9 +23,9 @@ def when_for(controller):
def expose(template=None,
- content_type='text/html',
generic=False,
- route=None):
+ route=None,
+ **kw):
'''
Decorator used to flag controller methods as being "exposed" for
@@ -46,6 +46,8 @@ def expose(template=None,
wanted to route a function to `some-special-path'.
'''
+ content_type = kw.get('content_type', 'text/html')
+
if template == 'json':
content_type = 'application/json'
@@ -54,6 +56,7 @@ def expose(template=None,
f.exposed = True
cfg = _cfg(f)
+ cfg['explicit_content_type'] = 'content_type' in kw
if route:
# This import is here to avoid a circular import issue
diff --git a/pecan/tests/test_base.py b/pecan/tests/test_base.py
index 785b522..44f87db 100644
--- a/pecan/tests/test_base.py
+++ b/pecan/tests/test_base.py
@@ -1957,6 +1957,18 @@ class TestEngines(PecanTestCase):
result = dict(json.loads(r.body.decode()))
assert result == {'name': 'Bill'}
+ def test_default_json_renderer_with_explicit_content_type(self):
+
+ class RootController(object):
+ @expose(content_type='text/plain')
+ def index(self, name='Bill'):
+ return name
+
+ app = TestApp(Pecan(RootController(), default_renderer='json'))
+ r = app.get('/')
+ assert r.status_int == 200
+ assert r.body == b_("Bill")
+
class TestDeprecatedRouteMethod(PecanTestCase):