Question

J'utilise Flask (VSN 0,8) et Flask-WTF (VSN 0.5.2) (par exemple, pour analyser les formes) pour faire un site joli simple. Cependant, je suis incapable d'obtenir Flask-WTF pour analyser correctement mes résultats GET.

Mon apparence de code pertinents comme celui-ci:

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

Si je soumets ma forme avec un champ unique appelé « aws_id » avec GET je reçois la sortie suivante sur la 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

Il me semble que SUBMIT fonctionne correctement, mais Flask-WTF ne fait pas son travail. Essentiellement, l'ancienne façon de traiter avec des œuvres de sortie de forme, la méthode request.args.get, mais la nouvelle form.is_submitted et form.validate_on_submit ne font pas leur bonté magique.

Toutes les idées? (WTF!)

Était-ce utile?

La solution

Je déplacé mon application à la racine de mon site, supprimé celui qui était là (= redondant), et a ajouté request.form à la classe MyForm. Cela semble le fixer. Il était également nécessaire de définir csrf_enabled 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)

Autres conseils

méthode classe Form is_submitted de Flask-WTF regards comme:

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

Et dans son __init__ a ce code, qui assure normalement formdata est chargé automatiquement de la demande Flask:

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

Il est donc clair ... si vous soumettez le formulaire via GET vous ne recevez pas de bonne conduite automobile. Cela est compréhensible parce que si elle est une requête GET, il est pas clair si la forme a été présentée ou vous chargeaient juste la page. Ceci est en dehors de tout problème de CSRF.

validate_on_submit ne fonctionne pas non plus, car elle se fonde également sur is_submitted

Flask lui-même ne pas également analyser les champs GET dans request.form pour vous.

Vous finissez par avoir à faire quelque chose comme:

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

(tous assumer vos hérite de la classe MyForm de from flask.ext.wtf import Form)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top