2015-07-31 13 views
8

Ich habe eine Tabelle im Navigationssystem meiner Webapp, die jedes Mal, wenn eine Seite gerendert wird, mit aktuellen Informationen gefüllt wird. Wie kann ich vermeiden, den folgenden Code in jede view zu setzen?Übergeben Sie Variablen an alle Jinja2-Vorlagen mit Flask

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

mydict wird verwendet, um die Tabelle zu füllen. Die Tabelle wird auf jeder Seite angezeigt

Antwort

15

können Sie Flask's Context Processors verwenden Globals in Ihre jinja Vorlagen

Hier zu injizieren ein Beispiel:

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

Um neue Variablen automatisch in den Kontext einer Vorlage zu injizieren, Kontext Prozessoren existieren in Flask. Kontextprozessoren werden ausgeführt, bevor die Vorlage gerendert wird und können neue Werte in den Vorlagenkontext einfügen. Ein Kontextprozessor ist eine Funktion, die ein Wörterbuch zurückgibt. Die Schlüssel und Werte dieses Wörterbuchs fusionierten dann mit der Vorlage Kontext für alle Vorlagen im App:

+0

es also nicht für andere zu verwirren, vielleicht Erwähnen Sie, dass Flask nach einem "dict" sucht, das zurückgegeben werden soll, egal ob meine Variable eine 'string',' list' oder ein anderer Datentyp ist –

1

Schreiben Sie Ihre eigene Render-Methode halten Sie sich davon ab, diesen Code zu wiederholen. Rufen Sie es dann auf, wenn Sie eine Vorlage rendern müssen.

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') 
+0

Joshs Antwort nicht verlangen, dass ich alle meine vorhandenen Vorlagen ändern –

Verwandte Themen