Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Is there a bottle.py equivalent of context processors that you get in Flask?

like image 685
Matt Swain Avatar asked Mar 18 '12 15:03

Matt Swain


2 Answers

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 views
SimpleTemplate.defaults["get_url"] = app.get_url
SimpleTemplate.defaults["url"] = lambda: request.url
SimpleTemplate.defaults["fullpath"] = lambda: request.fullpath
SimpleTemplate.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

like image 190
Helgi Avatar answered Sep 28 '22 04:09

Helgi


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'
like image 40
Augustin Laville Avatar answered Sep 28 '22 05:09

Augustin Laville