Frage

Ich verwende Flask (vsn 0.8) und Flask-WTF (vsn 0.5.2) (z. B. um Formulare zu analysieren), um eine ziemlich einfache Website zu erstellen.Ich kann Flask-WTF jedoch nicht dazu bringen, meine GET-Ergebnisse ordnungsgemäß zu analysieren.

Mein relevanter Code sieht folgendermaßen aus:

@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)

Wenn ich mein Formular mit einem einzigen Feld namens 'aws_id' mit GET abschicke, erhalte ich die folgende Ausgabe auf der Konsole.

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

Es sieht für mich so aus, als ob die Übermittlung korrekt funktioniert, aber Flask-WTF macht seine Sache nicht.Im Wesentlichen funktioniert die alte Art des Umgangs mit der Formularausgabe, die request.args.get-Methode, aber die neuen form.is_submitted und form.validate_on_submit tun nicht ihre magische Güte.

Irgendwelche Ideen?(WTF!)

War es hilfreich?

Lösung

Ich habe meine App in das Stammverzeichnis meiner Website verschoben, die dort vorhandene (= redundant) gelöscht und der MyForm-Klasse request.form hinzugefügt.Das scheint es zu beheben.Es war auch notwendig, csrf_enabled auf false zu setzen.

@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)

Andere Tipps

Die Form-Klasse is_submitted von Flask-WTF sieht folgendermaßen aus:

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")

Und in seinem __init__ befindet sich dieser Code, der normalerweise sicherstellt, dass Formulardaten automatisch aus der Flask-Anfrage geladen werden:

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

Es ist also klar ... Wenn Sie das Formular über GET senden, erhalten Sie kein nettes automatisches Verhalten.Dies ist verständlich, da bei einer GET-Anfrage nicht klar ist, ob das Formular gesendet wurde oder Sie gerade die Seite geladen haben.Dies gilt nicht für CSRF-Probleme.

validate_on_submit funktioniert auch nicht, da es auch auf is_submitted beruht

Flask selbst analysiert die GET-Felder auch nicht für Sie in request.form.

Am Ende müssen Sie Folgendes tun:

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

(alle gehen davon aus, dass Ihre MyForm-Klasse von from flask.ext.wtf import Form erbt)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top