validator template passwordfield python forms validation flask wtforms

python - template - validator wtforms



Flask-WTF-validate_on_submit() nunca se ejecuta (5)

Estaba borrando la sesión del matraz si no estaba conectado antes de cada solicitud. Esto estaba causando este problema.

@main.before_request def before_request(): if not current_user.is_authenticated(): # TODO clean sessions may cause CSRF missing issue session.clear() print "Session Cleared" return redirect(url_for(''auth.login''))

Estoy usando Flask-WTF:

Aquí está mi formulario:

from flask.ext.wtf import Form, TextField class BookNewForm(Form): name = TextField(''Name'')

Aquí está el controlador:

@book.route(''/book/new'', methods=[''GET'', ''POST'']) def customers_new(): form = BookNewForm() if form.is_submitted(): print "submitted" if form.validate(): print "valid" if form.validate_on_submit(): flash("Successfully created a new book") return redirect(url_for(''.books_show'')) return render_template(''views/books_new.html'', form=form)

Ahora el problema es que, si miras los resúmenes de impresión, siempre se imprime enviado, pero NUNCA imprime válido y validate_on_submit () nunca se ejecuta. ¿Por qué?


Me encontré con esto cuando trato de renderizar un FormField FieldList sobre mi FieldList en mi plantilla. Tuve que insertar dos elementos hidden_tag uno para el formulario FieldList y otro para el formulario FieldForm , buscar los comentarios de plantilla para la palabra clave "HIDDEN TAG"

class ParamRangeForm( FlaskForm ): minX = FloatField( ) maxX = FloatField( ) class ParamRangesForm( FlaskForm ): paramRanges = FieldList( FormField( ParamRangeForm ) ) submit = SubmitField( ''Submit'' ) def loadParams( self ) : for paramName in ["p1" , "p2" , "p3", "p4"] : prf = ParamRangeForm( ) prf.minX = -100.9#float(''-inf'') prf.maxX = 100.5#float(''-inf'') self.paramRanges.append_entry( prf ) ... <form action="" method="POST" enctype="multipart/form-data"> {{ rangesForm.hidden_tag() }} <!--#### HIDDEN TAG #1 --> <table> <!--Print Column Headers--> <thead> <tr> <th class="ColumnHeader">Parameter</td> <th class="ColumnHeader">Min</td> <th class="ColumnHeader">Max</td> </tr> </thead> <!--Print Parameter Rows--> <tbody> {% for paramRange in rangesForm.paramRanges %} <tr> {{ paramRange.hidden_tag() }} <!--#### HIDDEN TAG #2 --> <td>p{{ loop.index }}</td> <td>{{ paramRange.minX }}</td> <td>{{ paramRange.maxX }}</td> </tr> {% endfor %} </tbody> </table> </div> {{ rangesForm.submit() }} </form>


No está insertando el campo CSRF en el formulario HTML.

<form method=post> {{ form.csrf_token }} {{ form.name }} <input type=submit> </form>

Después de agregar form.csrf_token a la plantilla ( docs ), el formulario se validará como se espera.

Agregue print(form.errors) después de validar el formulario para ver los errores que se generaron. errors estarán vacíos antes de la validación. En este caso, hay un error sobre la falta

@book.route(''/book/new_no_csrf'', methods=[''GET'', ''POST'']) def customers_new_no_csrf(): form = BookNewForm() print(form.errors) if form.is_submitted(): print "submitted" if form.validate(): print "valid" print(form.errors) if form.validate_on_submit(): flash("Successfully created a new book") return redirect(url_for(''.books_show'')) return render_template(''books_new.html'', form=form)

{} submitted {''csrf_token'': [u''CSRF token missing'']} 127.0.0.1 - - [29/May/2012 02:01:08] "POST /book/new_no_csrf HTTP/1.1" 200 - 127.0.0.1 - - [29/May/2012 02:01:08] "GET /favicon.ico HTTP/1.1" 404 -

Creé un ejemplo en GitHub.


inserte esto después de la etiqueta en el archivo html de la plantilla:

{{ form.csrf_token }}


puedes imprimir errores

print form.errors

o

app.logger.debug(form.errors)

y si tiene csrf-error, debe establecer form.csrf_token en su plantilla.