简体   繁体   English

flask form.validate_on_submit() 使用 wtforms 失败

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM