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

¿Fue útil?

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)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top