Flachmann-form.validate_on_submit() fehlschlägt, mit wtforms
Verwendung von @dirn Vorschläge, die Validierungs-Fehler nicht anzeigen, nicht mehr, aber es scheint immer noch scheitern, da weder die print-Anweisung in den root () - Funktion zeigt/führt auch nicht die neue form.Fehler zeigen.
App-Code:
#!/usr/bin/env python
import cherrypy
import os
from flask import Flask, render_template, redirect, url_for, session, request, flash, abort, Markup
from flask.ext.bootstrap import Bootstrap
from sybload import funcs, forms
app = Flask(__name__)
app.debug = True
app.config['SECRET_KEY'] = os.urandom(24)
app.config['CSRF_ENABLED'] = True
bootstrap = Bootstrap(app)
dataserver_info = funcs.get_dataserver_info()
dataservers = funcs.get_dataservers(dataserver_info)
@app.route('/', methods=['GET', 'POST'])
def root():
session.clear()
form = forms.DataServersForm()
form.dataserver.choices = zip(dataservers, dataservers)
if form.validate_on_submit():
session['dataserver'] = form.dataserver.data
# print statement below never runs
print session['dataserver'], form.dataserver.data
return redirect(url_for('login'))
return render_template('root.html', title='Sybase Load App', form=form)
def run_server():
cherrypy.tree.graft(app, '/')
cherrypy.config.update({
'log.access_file': 'logs/access.log',
'log.error_file': 'logs/errors.log',
'engine.autoreload_on': True,
'log.screen': True,
'server.socket_host': '0.0.0.0',
'server.socket_port': 5000,
'tools.sessions.on': True,
'tools.sessions.secure': True,
'tools.sessions.httponly': True
})
cherrypy.engine.start()
cherrypy.engine.block()
if __name__ == '__main__':
run_server()
Vorlage (jinja2):
{% block body %}
<form method='post' action='{{ url_for('login') }}'>
{{ form.hidden_tag() }}
{{ form.dataserver.label }}<br>
{{ form.dataserver }}<br><br>
{{ form.submit }}
</form>
<!-- Below never displays -->
{% if form.errors %}
failed validation
{% endif %}
{% endblock %}
Form:
from flask.ext.wtf import Form
from wtforms import StringField, PasswordField, SelectField, SelectMultipleField, SubmitField, BooleanField
from wtforms.validators import Required
import funcs
class DataServersForm(Form):
dataserver = SelectField('Dataservers', validators=[Required()])
submit = SubmitField('Submit')
- Sie code-Beispiel zeigt Ihnen die Verwendung
validate
Methode nichtvalidate_on_submit
. - Auch die url Ihres Formulars Beiträge ist nicht die url angezeigt in der app.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Rufen Sie
form.validate()
jedesmal, wenn jemand auf'/'
. Wenn die Anfrage BEKOMMEN, es ist keine form von Daten verursacht Validierung fehlschlägt. Sie wollen nur versuchen, zu validieren, die form, wenn der Antrag einen BEITRAG.Einen Weg, dies zu tun ist, um die request-Methode.
Weiteren gemeinsamen Weg, dies zu tun ist mit
validate_on_submit
. Es behandelt die überprüfung für die Beiträge sowie die Validierung des Formulars.Hier würden Sie verlieren Ihre Fähigkeit, flash -
'validation failed'
Nachricht. Das kann akzeptabel sein, denn Sie können überprüfen für den form-Fehler in der Vorlage.UPDATE
Wenn Sie sehen wollen, die Fehler (die Sie nicht), können Sie drucken Sie Sie in das template anstelle des generischen "überprüfung fehlgeschlagen" - Meldung.
@app.route('/', methods=['GET', 'POST']) def root(): session.clear() form = forms.DataServersForm() form.dataserver.choices = zip(dataservers, dataservers) if form.validate_on_submit(): session['dataserver'] = form.dataserver.data print session['dataserver'], form.dataserver.data return redirect(url_for('login')) return render_template('root.html', title='Sybase Load App', form=form)
form.errors
zu sehen, wenn das Formular nicht validieren?if
passieren wird. Sie brauchen, um zu überprüfen, es, nachdem (außerhalb) derif
. Ein solcher Ort zu tun, so wäre in der Vorlage, wie ich bereits erwähnt in der Antwort.