20
votes

I have a table in the navigation system of my webapp that will be populated with up-to-date information each time a page is rendered. How could I avoid putting the following code in each view?

def myview():
    mydict = code_to_generate_dict() 
    return render_template('main_page.html',mydict=mydict)

mydict is used to populate the table. The table will show up on each page

2

2 Answers

35
votes

You can use Flask's Context Processors to inject globals into your jinja templates

Here is an example:

@app.context_processor
def inject_dict_for_all_templates():
    return dict(mydict=code_to_generate_dict())

To inject new variables automatically into the context of a template, context processors exist in Flask. Context processors run before the template is rendered and have the ability to inject new values into the template context. A context processor is a function that returns a dictionary. The keys and values of this dictionary are then merged with the template context, for all templates in the app:

0
votes

Write your own render method do keep yourself from repeating that code. Then call it whenever you need to render a template.

def render_with_dict(template):
    mydict = code_to_generate_dict() 
    return render_template(template, mydict=mydict)

def myview():
    return render_with_dict('main_page.html')