Hi Christoph,
Initial testing shows it works like a charm :)
I made one change, though - in the before_validate method, I pop off
the self.callback rather than 'callback'. The reasoning behind this,
is that I want to be able to specify the name of the HTTP request
parameter which contains the name of the callback method in the
decorator.
So I use expose_jsonp('jsoncallback'), then send an HTTP request like
'http://localhost:8080/my/path/to/controller?
jsoncallback=jsonp1234321', and then get the result
'jsonp1234321({...json stuff here...})'.
Here's my modified before_validate:
def before_validate(self, remainder, params):
if self.exclude_callback:
tmpl_context.callback = self.callback
else:
tmpl_context.callback = params.pop(
self.callback, self.callback)
Thanks :)))
Cheers,
C
On Oct 24, 1:55 pm, Christoph Zwerschke <[email protected]> wrote:
> Am 24.10.2010 14:24 schrieb [email protected]:
>
> > In my attempts to solve this problem, I'd also tried to write a custom
> > decorator to do this ... but didn't get that to work for a variety of
> > reasons - some certainly due to the fact that I don't yet understand
> > TurboGears fully enough! ;)
>
> I think the real problem is that this stuff is not yet documented good
> enough. How about the following solution?
>
> -----------------------------------------------------------
>
> from tg import json_encode, tmpl_context
> from tg.decorators import Decoration
> from tg.render import _get_tg_vars
>
> class expose_jsonp(object):
>
> def __init__(self, callback=None, exclude_names=None):
> if callback is None:
> callback = 'callback'
> if exclude_names is None:
> exclude_names = []
> if 'tmpl_context' not in exclude_names:
> exclude_names.append('tmpl_context')
> self.callback = callback
> self.exclude_names = exclude_names
> self.exclude_callback = 'callback' in exclude_names
>
> def before_validate(self, remainder, params):
> if self.exclude_callback:
> tmpl_context.callback = self.callback
> else:
> tmpl_context.callback = params.pop(
> 'callback', self.callback)
>
> def __call__(self, func):
> deco = Decoration.get_decoration(func)
> deco.register_hook(
> 'before_validate', self.before_validate)
> deco.register_template_engine(
> 'text/javascript; charset=utf-8',
> 'jsonp', '', self.exclude_names)
> return func
>
> def render_jsonp(template_name, template_vars, **kwargs):
> callback = tmpl_context.callback
> for key in _get_tg_vars():
> del template_vars[key]
> return '%s(%s)' % (callback, json_encode(template_vars))
>
> from myapp.config.app_cfg import base_config
> base_config.render_functions['jsonp'] = render_jsonp
>
> -----------------------------------------------------------
>
> You can provide a default name for the callback in the decorator that
> can be overwritten by the client with the "callback" parameter unless
> you set exclude_names=['callback'].
>
> -- Christoph
--
You received this message because you are subscribed to the Google Groups
"TurboGears" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/turbogears?hl=en.