WTF-Flask ne traite pas ma réponse de forme
-
27-10-2019 - |
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!)
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
)