Files
pecan/docs/source/templates.rst
2012-03-13 17:03:10 -07:00

3.6 KiB

Templating in Pecan

Pecan supports a variety of templating engines out of the box, and also provides the ability to easily add support for new template engines. Currently, Pecan supports the following templating engines:

The default template system is mako, but can be configured by passing the default_renderer key in your app configuration:

app = {
    'default_renderer' : 'kajiki',
    # ...
}

The available renderer type strings are mako, genshi, kajiki, jinja, and json.

Using Template Renderers

pecan_decorators defines a decorator called @expose, which is used to flag a method as a controller. The @expose decorator takes a variety of parameters, including a template argument, which is the path to the template file to use for that controller. A controller will use the default template engine, unless the path is prefixed by another renderer name:

class MyController(object):
    @expose('path/to/mako/template.html')
    def index(self):
        return dict(message='I am a mako template')

    @expose('kajiki:path/to/kajiki/template.html')
    def my_controller(self):
        return dict(message='I am a kajiki template')

For more information on the expose decorator, refer to pecan_decorators, pecan_core, and routing.

Template Overrides and Manual Rendering

The pecan_core module contains two useful helper functions related to templating. The first is override_template, which allows you to overrides which template is used in your controller, and the second is render, which allows you to manually render output using the Pecan templating framework.

To use override_template, simply call it within the body of your controller

class MyController(object):
    @expose('template_one.html')
    def index(self):
        # ...
        override_template('template_two.html')
        return dict(message='I will now render with template_two.html')

The render helper is also quite simple to use:

@expose()
def controller(self):
    return render('my_template.html', dict(message='I am the namespace'))

The JSON Renderer

Pecan also provides a JSON renderer, e.g., @expose('json'). For more information on using JSON in Pecan, please refer to jsonify and pecan_jsonify.

Defining Custom Renderers

To define a custom renderer, you can create a class that follows a simple protocol:

class MyRenderer(object):
    def __init__(self, path, extra_vars):
        '''
        Your renderer is provided with a path to templates,
        as configured by your application, and any extra 
        template variables, also as configured
        '''
        pass

    def render(self, template_path, namespace):
        '''
        Lookup the template based on the path, and render 
        your output based upon the supplied namespace 
        dictionary, as returned from the controller.
        '''
        return str(namespace)

To enable your custom renderer, you can define a custom_renderers key in your application's configuration:

app = {
    'custom_renderers' : {
        'my_renderer' : MyRenderer
    },
    # ...
}