Flask-WTF no está procesando mi respuesta de formulario
-
27-10-2019 - |
Pregunta
Estoy usando Flask (vsn 0.8) y Flask-WTF (vsn 0.5.2) (por ejemplo, para analizar formularios) para hacer un sitio web bastante simple.Sin embargo, no puedo hacer que Flask-WTF analice correctamente mis resultados GET.
Mi código relevante se ve así:
@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 envío mi formulario con un solo campo llamado 'aws_id' con GET, obtengo el siguiente resultado en la consola.
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
Me parece que el envío funciona correctamente, pero Flask-WTF no está haciendo lo suyo.Esencialmente, la antigua forma de lidiar con la salida de formularios funciona, el método request.args.get, pero el nuevo form.is_submitted y form.validate_on_submit no están haciendo su magia.
¿Alguna idea?(¡WTF!)
Solución
Moví mi aplicación a la raíz de mi sitio, eliminé la que estaba allí (= redundante) y agregué request.form
a la clase MyForm.Eso parece arreglarlo.También era necesario establecer csrf_enabled
en 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)
Otros consejos
El método Form
de la clase is_submitted
de Flask-WTF se ve así:
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")
Y en su __init__
tiene este código, que normalmente asegura que formdata se cargue automáticamente desde la solicitud de Flask:
if formdata is _Auto:
if self.is_submitted():
formdata = request.form
Así que está claro ... si envía el formulario a través de GET, no obtendrá ninguno de los buenos comportamientos automáticos.Esto es comprensible porque si se trata de una solicitud GET, no está claro si el formulario se envió o simplemente estaba cargando la página.Esto es aparte de cualquier problema de CSRF.
validate_on_submit
tampoco funciona, ya que también se basa en is_submitted
El propio Flask tampoco analiza los campos GET en request.form
por usted.
Terminas teniendo que hacer algo como:
form = MyForm(request.args, csrf_enabled=False)
if 'aws_id' in request.args and form.validate():
flash('Success')
aws_id = form.aws_id.data
(todos asumen que su clase MyForm
hereda de from flask.ext.wtf import Form
)