adding ability to change content type when overriding template
This commit is contained in:
@@ -41,8 +41,10 @@ request = proxy('request')
|
|||||||
response = proxy('response')
|
response = proxy('response')
|
||||||
|
|
||||||
|
|
||||||
def override_template(template):
|
def override_template(template, content_type=None):
|
||||||
request.override_template = template
|
request.override_template = template
|
||||||
|
if content_type:
|
||||||
|
request.override_content_type = content_type
|
||||||
|
|
||||||
def abort(status_code=None, detail='', headers=None, comment=None):
|
def abort(status_code=None, detail='', headers=None, comment=None):
|
||||||
raise exc.status_map[status_code](detail=detail, headers=headers, comment=comment)
|
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
|
# pull the template out based upon content type and handle overrides
|
||||||
template = cfg.get('content_types', {}).get(state.content_type)
|
template = cfg.get('content_types', {}).get(state.content_type)
|
||||||
|
|
||||||
|
# check if for controller override of template
|
||||||
template = getattr(request, 'override_template', 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 there is a template, render it
|
||||||
if template:
|
if template:
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ from paste.recursive import ForwardRequestException
|
|||||||
from unittest import TestCase
|
from unittest import TestCase
|
||||||
from webtest import TestApp
|
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
|
from pecan.templating import _builtin_renderers as builtin_renderers
|
||||||
|
|
||||||
import os
|
import os
|
||||||
@@ -620,3 +620,15 @@ class TestEngines(object):
|
|||||||
assert r.status_int == 200
|
assert r.status_int == 200
|
||||||
result = dict(loads(r.body))
|
result = dict(loads(r.body))
|
||||||
assert result == expected_result
|
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
|
||||||
|
|||||||
Reference in New Issue
Block a user