Warning: Can't synchronize with repository "(default)" (Unsupported version control system "svn": No module named svn). Look in the Trac log for more information.

Ticket #2513 (closed defect: migrated)

Opened 9 years ago

Last modified 8 years ago

Problems with custom render functions and missing JSONP support

Reported by: chrisz Owned by:
Priority: normal Milestone: 2.1
Component: TurboGears Version: 2.1rc1
Severity: normal Keywords: jsonp


Currently, TG 2.1rc1 does not come with a templating engine for JSONP.

You can add a render function this:

from tg import json_encode, response
from tg.render import _get_tg_vars

def render_jsonp(template_name, template_vars, **kwargs):
    callback = template_name or kwargs.pop('callback', None) or 'callback'
    for key in _get_tg_vars():
        del template_vars[key]
    response.headers['Content-Type'] = 'text/javascript'
    return '%s(%s)' % (template_name, json_encode(template_vars))

from myapp.config.app_cfg import base_config
base_config.render_functions['jsonp'] = render_jsonp
base_config.mimetype_lookup = {'.jsonp': 'text/javascript'}

But this reveals two shortcomings:

  1. In this case, we don't want any templating vars, and need to remove them using the undocumented function _get_tg_vars(). It would be better and more performant if the templating vars would not be included in the first place. But unfortunately, the templating engines which don't use templating vars are hard coded in TG (currently 'json' and 'amf') in two places in tg.decorators and tg.render. This should be made configurable.
  1. I don't see a way of defining a default content type for the render function, so I have to set it directly on the response object which is really not nice. The render functions should not touch the request or response objects.
  1. After fixing 1. and 2. we may think about adding a JSONP renderer to the core.

Change History

comment:1 Changed 8 years ago by pedersen

  • Status changed from new to closed
  • Resolution set to migrated
Note: See TracTickets for help on using tickets.