2013-06-12 16 views
28

nel pallone, posso fare questo:redirect mentre il passaggio di argomenti

render_template("foo.html", messages={'main':'hello'}) 

E se foo.html contiene {{ messages['main'] }}, la pagina mostrerà hello. Ma cosa succede se c'è un percorso che porta a foo:

@app.route("/foo") 
def do_foo(): 
    # do some logic here 
    return render_template("foo.html") 

In questo caso, l'unico modo per arrivare a foo.html, se voglio che la logica accada in ogni caso, è attraverso un redirect:

@app.route("/baz") 
def do_baz(): 
    if some_condition: 
     return render_template("baz.html") 
    else: 
     return redirect("/foo", messages={"main":"Condition failed on page baz"}) 
     # above produces TypeError: redirect() got an unexpected keyword argument 'messages' 

Quindi, come posso ottenere che la variabile messages venga passata alla route foo, in modo che non debba semplicemente riscrivere lo stesso codice logico che quella route calcola prima di caricarla?

risposta

41

È possibile passare i messaggi come parametro URL esplicito (opportunamente codificato) oppure archiviare i messaggi nella variabile session (cookie) prima di reindirizzare e quindi ottenere la variabile prima di renderizzare il modello. Per esempio:

def do_baz(): 
    messages = json.dumps({"main":"Condition failed on page baz"}) 
    session['messages'] = messages 
    return redirect(url_for('.do_foo', messages=messages)) 

@app.route('/foo') 
def do_foo(): 
    messages = request.args['messages'] # counterpart for url_for() 
    messages = session['messages']  # counterpart for session 
    return render_template("foo.html", messages=json.loads(messages)) 

(che codifica per la variabile di sessione potrebbe non essere necessario, pallone può essere maneggiarlo per voi, ma non può ricordare i dettagli)

Oppure si potrebbe probabilmente basta usare Flask Message Flashing se solo bisogno di mostrare messaggi semplici

+3

+1, il messaggio che lampeggia è sicuramente la strada da percorrere –

+0

array numpy restituisce typeError con sessione, non è serializzabile JSON – erogol

+0

Il problema con la sessione qui è che si può avere una condizione di competizione: se qualcuno richiede la stessa pagina due volte contemporaneamente, potrebbe ricevere i messaggi su quella sbagliata. – bfontaine

2

Sono un po 'confuso. "foo.html" è solo il nome del tuo modello. Non esiste una relazione intrinseca tra il nome della rotta "foo" e il nome del modello "foo.html".

Per raggiungere l'obiettivo di non riscrivere il codice logico per due percorsi diversi, vorrei definire una funzione e chiamarla per entrambi i percorsi. Non vorrei usare reindirizzare perché in realtà reindirizza il client/browser, che impone loro di caricare due pagine invece di uno solo per risparmiare un po 'di tempo di codifica - che sembra significare :-P

Così forse:

def super_cool_logic(): 
    # execute common code here 

@app.route("/foo") 
def do_foo(): 
    # do some logic here 
    super_cool_logic() 
    return render_template("foo.html") 

@app.route("/baz") 
def do_baz(): 
    if some_condition: 
     return render_template("baz.html") 
    else: 
     super_cool_logic() 
     return render_template("foo.html", messages={"main":"Condition failed on page baz"}) 

Mi sento come se mi mancasse qualcosa e c'è un modo migliore per raggiungere quello che stai cercando di fare (non sono proprio sicuro di quello che stai cercando di fare)

Problemi correlati