2013-07-23 8 views
5

Diciamo che ho un modello di base con un'intestazione e il contenuto di tale intestazione deve essere passato nel modello.Jinja2 e Flask: passa la variabile nel modello principale senza passarla ai figli

<header> 
    You are logged in as {{ name }} 
</header> 

Questo modello di base viene esteso di molte pagine. Come posso passare a quella variabile senza passarla a ogni singolo bambino? Per esempio, non voglio fare questo:

render_template("child1.html", name=user.name) 
render_template("child2.html", name=user.name) 
render_template("child3.html", name=user.name) 
etc... 

perché chissà quante pagine figlio potrei avere. Non sembra abbastanza ASCIUTTO.

Non ho mai effettivamente renderizzato il modello di base, solo i suoi figli, ma non so in che altro modo passare i dati.

C'è un modo per farlo? Non dovrei usare l'ereditarietà?

risposta

9

Posso suggerire di usare la variabile globale 'g' nel pallone. Questo è di default disponibile nei template jinja. Quindi non devi preoccuparti di passarlo ovunque nel modello base o nei bambini. Basta fare in modo si imposta per prima quando si effettua il login

g.username = user.name 

poi nei modelli, basta fare questo:

You are logged in as {{ g.username }} 
+1

Ultima versione Flask (credo che a partire da 0.10) offre questo errore: 'RuntimeError: funziona fuori dal contesto dell'applicazione '. Qualcuno sa come affrontarlo? –

1

è necessario utilizzare di context-processors Flask:

@app.context_processor 
def inject_user(): 
    return dict(user=g.user) 

Vedere questo simili SO question and answer .

Un esempio di come lo sto usando (semplicemente inserire le impostazioni di applicazione di configurazione):

@app.context_processor 
def lib_versions(): 
    return dict(
     bokehversion = app.config['BOKEH_VERSION'], 
     jqueryversion = app.config['JQUERY_VERSION'], 
     jqueryuiversion = app.config['JQUERYUI_VERSION'], 
     bootstrapversion = app.config['BOOTSTRAP_VERSION'], 
    ) 

che sono tirati dal mio Flask file di configurazione:

class Config(object): 
    DEBUG = True 
    TESTING = True 
    SQLALCHEMY_DATABASE_URI = '' 
    TMP_DIR = '' 
    STATIC_FOLDER = '' 
    BOKEH_VERSION = '0.8.2' 
    JQUERY_VERSION = '1.11.2' 
    JQUERYUI_VERSION = '1.11.4' 
    BOOTSTRAP_VERSION = '3.3.4' 

class ProductionConfig(Config): 
    DEBUG = False 
    TESTING = False 

È quindi chiamare questi nel vostro modello base proprio come qualsiasi altra variabile Jinja2:

<!-- START: CSS --> 
<link rel="stylesheet" media="screen" type="text/css" href="http://cdn.pydata.org/bokeh/release/bokeh-{{ bokehversion }}.min.css"> 
<!-- END: CSS --> 
<!-- START: JS --> 
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/{{ jqueryversion }}/jquery.min.js"></script> 
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/{{ jqueryuiversion }}/jquery-ui.min.js"></script> 
<script type="text/javascript" src="//maxcdn.bootstrapcdn.com/bootstrap/{{ bootstrapversion }}/js/bootstrap.min.js"></script> 
<!-- END: JS -->