Include variables in template context on every page with Bottle.py Include variables in template context on every page with Bottle.py flask flask

Include variables in template context on every page with Bottle.py


If you're using vanilla Bottle with SimpleTemplate, there is a solution I've stumbled upon.

For my site, I needed access to some functions in every template, app.get_url being obviously one of them. This worked for me:

# after app creation, but before the viewsSimpleTemplate.defaults["get_url"] = app.get_urlSimpleTemplate.defaults["url"] = lambda: request.urlSimpleTemplate.defaults["fullpath"] = lambda: request.fullpathSimpleTemplate.defaults["sorted"] = sorted

This works as of Bottle 0.9, I didn't test on more recent versions of the framework.

This behavior is undocumented, but Marcel Hellkamp explained it in this thread. In there, other solutions are also mentioned:

  • Pass over the globals in _vars or a similar template arg.
  • Create a decorator to supply the defaults.

Also, in Bottle 0.10, new functions related to the problem were introduced in the SimpleTemplate template namespace: defined, get, and setdefault


Note: this same solution can be used with the other template engines. The technique is exactly the same, but you use BaseTemplate (it works for all template classes) or the class for the engine you want to use.


Using the previous answer from Helgi, I use this hook to make a context processor like (bottle 0.12.x) :

import bottle@bottle.hook('before_request')def _context_processor():    bottle.SimpleTemplate.defaults['foo'] = 'F00'    bottle.SimpleTemplate.defaults['bar'] = 'B@R'