[英]flask form.validate_on_submit() fails using wtforms
Using @dirn's suggestions, the validation error does not display anymore, but it still seems to fail as neither the print statement in the root() function displays/runs nor does the new form.errors show.使用@dirn 的建议,验证错误不再显示,但它似乎仍然失败,因为 root() 函数中的打印语句既不显示/运行,也不显示新的 form.errors。
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()
Template (jinja2):模板(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')
You call form.validate()
everytime someone visits '/'
. 每当有人访问
'/'
您就调用form.validate()
。 When the request is a GET, there is no form data causing validation to fail. 当请求是GET时,没有表单数据导致验证失败。 You only want to try to validate the form when the request is a POST.
您只想在请求为POST时尝试验证表单。
One way to do that is to check the request's method. 一种方法是检查请求的方法。
if request.method == 'POST':
if form.validate():
session['dataserver'] = ds = form.dataserver.data
return redirect(url_for('login'))
else:
flash('Failed validation')
Another common way to do this is with validate_on_submit
. 另一个常用的方法是
validate_on_submit
。 It handles checking for POSTs as well as validating the form. 它处理POST的检查以及表单的验证。
if form.validate_on_submit():
session['dataserver'] = ds = form.dataserver.data
return redirect(url_for('login'))
Here you'd lose your ability to flash your 'validation failed'
message. 在这里,您将失去刷新
'validation failed'
消息的能力。 That may be acceptable, though, because you can check for form errors in your template. 不过,这是可以接受的,因为您可以检查模板中的表单错误。
{% if form.errors %}
failed validation
{% endif %}
UPDATE 更新
If you want to see the errors (which you may not), you can print them in the template instead of the generic "failed validation" message. 如果要查看错误(可能不会),则可以在模板中打印它们,而不是常规的“验证失败”消息。
{% if form.errors %}
{{ form.errors }}
{% endif %}
在我的情况下,同样的问题结果是缺少 CSRF 令牌。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.