2015-07-31 16 views
8

Ho una tabella nel sistema di navigazione della mia webapp che verrà popolata con informazioni aggiornate ogni volta che una pagina viene visualizzata. Come potrei evitare di inserire il seguente codice in ogni view?Passa le variabili a tutti i modelli Jinja2 con Flask

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

mydict viene utilizzato per popolare la tabella. La tabella apparirà in ogni pagina

risposta

15

È possibile utilizzare Flask's Context Processors per iniettare globali nei vostri modelli di Jinja

Ecco un esempio:

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

per iniettare nuove variabili automaticamente nel contesto di un modello, contesto i processori esistono in Flask. I processori di contesto vengono eseguiti prima del rendering del modello e sono in grado di iniettare nuovi valori nel contesto del modello . Un processore di contesto è una funzione che restituisce un dizionario . Le chiavi ei valori di questo dizionario sono poi fuse con il contesto modello, per tutti i modelli in App:

+0

quindi non è fonte di confusione per gli altri, forse menzionare che Flask sta cercando un 'dict' da restituire, se la mia variabile da iniettare è una' stringa', 'lista', o qualsiasi altro tipo di dati (incluso un' dict') –

1

Scrivi il tuo metodo di rendering per evitare di ripetere quel codice. Quindi chiamalo ogni volta che è necessario eseguire il rendering di un modello.

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

risposta di Josh non richiedeva che modifico tutti i miei modelli esistenti –

Problemi correlati