repoze.bfg bindings for Mako

These are bindings for the Mako templating system for the `repoze.bfg <`_ web framework.

High-Level API

The API follows the pattern of the "default" template API for repoze.bfg, which includes three functions: get_template, render_template, and render_template_to_response. From within a repoze.bfg view function, you might do:

from webob import Response

from repoze.bfg.renderers import get_renderer
template = get_renderer('templates/foo.mak')
return Response(template.render_unicode(foo=1))


from repoze.bfg.renderers import render
s = render('templates/foo.mak', {foo:1})
return Response(s)


from repoze.bfg.renderers import render_to_response
return render_to_response('templates/foo.mak', {foo:1})

All of these examples are equivalent. The first argument passed in to each of them (representing the template location) should be a file path relative to the lookup loader root.

The value passed to render or render_to_response should be one of the following:

  • A dictionary representing the values passed to the template.
  • A tuple, consisting of two values in the form (function_name, values). If a tuple is returned, the def named after function_name in the template is rendered instead of the entire template using the values provided, which must be a dictionary). Positional arguments to the function defined within the template are filled in by name using the same-named values within the values dictionary.

Configuring the Loookup Loader

In your bfg application's .ini file, use a mako.directories setting:

use = egg:mypackage
mako.directories = mypackage:templates
reload_templates = true
debug_authorization = false
debug_notfound = false

mako.directories should be a sequence of absolute directory names or resource specifications, one per line.

Other values:

Set the mako template input encoding. The default is utf-8.
If this is True, Mako templates will be checked for changes at every rendering boundary. This slows down rendering but is convenient for development.

Ensuring the Mako Renderer Extension is Active

repoze.bfg.mako can also act as a "renderer" for a view when it is active in the repoze.bfg application you're developing:

def aview(request):
    return {'foo':1}

There are two ways to make sure that the mako extension is active. Both are completely equivalent.

  1. Ensure that some ZCML file with an analogue of the following contents is executed:

    <include package="repoze.bfg.mako"/>
  2. Call the add_renderer method of a Configurator in your application:

    from repoze.bfg.mako import renderer_factory config.add_renderer(.'mak', renderer_factory) config.add_renderer(.'mako', renderer_factory)

In either case, files with the .mak and .mako extensions are now considered to be Mako templates.

Note that when mako is used as a renderer in this fashion, the repoze.bfg context that is usually available as context within the template global namespace is available as _context (the context name without the underscore is reserved for internal Mako usage).


Install using setuptools, e.g. (within a virtualenv):

$ easy_install -i repoze.bfg.mako

Creating a Mako repoze.bfg Project

After you've got repoze.bfg.mako installed, you can invoke the following command to create a Mako-based repoze.bfg project:

$ paster create -t bin/paster create -t bfg_mako_starter

Reporting Bugs / Development Versions

Visit to report bugs. Visit to download development or tagged versions.