Domanda

Sto usando Flask (vsn 0.8) e Flask-WTF (vsn 0.5.2) (ad esempio, per analizzare i moduli) per creare un sito Web piuttosto semplice.Tuttavia, non riesco a far sì che Flask-WTF analizzi correttamente i miei risultati GET.

Il mio codice pertinente è simile a questo:

@app.route("/result", methods=("GET", "POST"))
def submit():
    form = MyForm()
    print request.args
    print request.args.get('aws_id', None, type=str)
    print form.is_submitted()
    if form.validate_on_submit():
        flash('Success')
        aws_id = form.aws_id.data
    return render_template("index.html", form=form)

Se invio il mio modulo con un singolo campo chiamato 'aws_id' con GET ottengo il seguente output sulla console.

127.0.0.1 - - [19/Oct/2011 22:28:59] "GET /result?aws_id=test_string HTTP/1.1" 200 -
ImmutableMultiDict([('aws_id', u'test_string')])
test_string
False

Mi sembra che il submit funzioni correttamente, ma Flask-WTF non sta facendo il suo dovere.In sostanza, il vecchio modo di gestire l'output del modulo funziona, il metodo request.args.get, ma i nuovi form.is_submitted e form.validate_on_submit non stanno facendo la loro magica bontà.

Qualche idea?(WTF!)

È stato utile?

Soluzione

Ho spostato la mia app nella radice del mio sito, ho eliminato quella che era lì (= ridondante) e ho aggiunto request.form alla classe MyForm.Questo sembra risolverlo.Era anche necessario impostare csrf_enabled su false.

@app.route("/", methods=("GET", "POST"))
def submit():
    form = MyForm(request.form, csrf_enabled=False)
    if form.validate_on_submit():
        print form.data

    return render_template("index.html", form=form)

Altri suggerimenti

Il metodo Form della classe is_submitted di Flask-WTF ha il seguente aspetto:

def is_submitted(self):
    """
    Checks if form has been submitted. The default case is if the HTTP
    method is **PUT** or **POST**.
    """

    return request and request.method in ("PUT", "POST")

E nel suo __init__ ha questo codice, che normalmente garantisce che i dati del form vengano caricati automaticamente dalla richiesta Flask:

    if formdata is _Auto:
        if self.is_submitted():
            formdata = request.form

Quindi è chiaro ... se invii il modulo tramite GET non ottieni nessuno dei simpatici comportamenti automatici.Questo è comprensibile perché se si tratta di una richiesta GET non è chiaro se il modulo è stato inviato o se stavi solo caricando la pagina.Questo è a parte qualsiasi problema CSRF.

nemmeno validate_on_submit, poiché si basa anche su is_submitted

Flask stesso inoltre non analizza i campi GET in request.form per te.

Finisci per dover fare qualcosa come:

form = MyForm(request.args, csrf_enabled=False)
if 'aws_id' in request.args and form.validate():
    flash('Success')
    aws_id = form.aws_id.data

(tutti presumono che la tua classe MyForm erediti da from flask.ext.wtf import Form)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top