diff --git a/pecan/core.py b/pecan/core.py index 1f0f5a0..56b99dd 100644 --- a/pecan/core.py +++ b/pecan/core.py @@ -41,8 +41,10 @@ request = proxy('request') response = proxy('response') -def override_template(template): +def override_template(template, content_type=None): request.override_template = template + if content_type: + request.override_content_type = content_type def abort(status_code=None, detail='', headers=None, comment=None): raise exc.status_map[status_code](detail=detail, headers=headers, comment=comment) @@ -290,7 +292,10 @@ class Pecan(object): # pull the template out based upon content type and handle overrides template = cfg.get('content_types', {}).get(state.content_type) + + # check if for controller override of template template = getattr(request, 'override_template', template) + state.content_type = getattr(request, 'override_content_type', state.content_type) # if there is a template, render it if template: diff --git a/tests/test_base.py b/tests/test_base.py index b05bfd9..68b6906 100644 --- a/tests/test_base.py +++ b/tests/test_base.py @@ -3,7 +3,7 @@ from paste.recursive import ForwardRequestException from unittest import TestCase from webtest import TestApp -from pecan import Pecan, expose, request, response, redirect, abort, make_app +from pecan import Pecan, expose, request, response, redirect, abort, make_app, override_template from pecan.templating import _builtin_renderers as builtin_renderers import os @@ -620,3 +620,15 @@ class TestEngines(object): assert r.status_int == 200 result = dict(loads(r.body)) assert result == expected_result + + def test_override_template(self): + class RootController(object): + @expose('foo.html') + def index(self): + override_template(None, content_type='text/plain') + return 'Override' + + app = TestApp(Pecan(RootController())) + r = app.get('/') + assert r.status_int == 200 + assert 'Override' in r.body