How can I send variables to Jinja template from a Flask decorator?

chrickso picture chrickso · Apr 7, 2013 · Viewed 26.6k times · Source

Many routes around my blueprinted flask app will need to send 'sidebar data' to jinja.

I'm looking for the most efficient way to do this. Their has to be something better than importing my 'generate_sidebar_data()' function into every blueprint, repeatedly saying:

var1, var2, var3 = generate_sidebar_data()

and then sending them with 'render_template':

return render_template('template.html',
                           var1=var1,
                           var2=var2,
                           var3=var3
                      )

What I want is a decorator that I can put with the route that will do the same thing the above does (run function and send the vars to jinja) but I don't know if this is possible. How do you send variables to jinja from inside a decorator function?

@blueprint.route('/')
@include_sidebar_data
def frontpage():

    return render_template('template.html')

Answer

wheaties picture wheaties · Apr 7, 2013

I'm going to propose something even simpler than using a decorator or template method or anything like that:

def render_sidebar_template(tmpl_name, **kwargs):
    (var1, var2, var3) = generate_sidebar_data()
    return render_template(tmpl_name, var1=var1, var2=var2, var3=var3, **kwargs)

Yup, just a function. That's all you really need, isn't it? See this Flask Snippet for inspiration. It's essentially doing exactly the same sort of thing, in a different context.