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 -
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.