2015-02-20 2 views
1

Используя предложения @ dirn, ошибка проверки больше не отображается, но она все еще кажется неудачной, поскольку ни оператор печати в функции root() не отображает/не запускает, и не делает новую форму .flask form.validate_on_submit() не работает с использованием wtforms

App Код:

#!/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() 

шаблона (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 %} 

Форма:

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') 
+0

Образец кода показывает, что вы используете метод 'validate', а не' validate_on_submit'. – justinfay

+0

Также URL-адрес вашей формы публикуется не в URL-адресе, указанном в приложении. – justinfay

ответ

4

form.validate() Вы называете каждый раз кто-то посещает '/'. Когда запрос является GET, данные формы не приводят к сбою проверки. Вы только хотите попытаться проверить форму, когда запрос является POST.

Один из способов сделать это, чтобы проверить способ запроса.

if request.method == 'POST': 
    if form.validate(): 
     session['dataserver'] = ds = form.dataserver.data 
     return redirect(url_for('login')) 
    else: 
     flash('Failed validation') 

Другой распространенный способ сделать это с validate_on_submit. Он обрабатывает проверку POST, а также проверку формы.

if form.validate_on_submit(): 
    session['dataserver'] = ds = form.dataserver.data 
    return redirect(url_for('login')) 

Здесь вы потеряете возможность прошить 'validation failed' сообщений. Это может быть приемлемым, хотя, поскольку вы можете проверить ошибки формы в своем шаблоне.

{% if form.errors %} 
    failed validation 
{% endif %} 

UPDATE

Если вы хотите увидеть ошибки (которые вы не можете), вы можете распечатать их в шаблоне вместо родового «не прошел проверку» сообщения.

{% if form.errors %} 
    {{ form.errors }} 
{% endif %} 
+0

После применения обоих ваших предложений, я считаю, что все еще что-то не так. Сессия ['dataserver'] никогда не устанавливается должным образом. '@ app.route ('/', methods = ['GET', 'POST']) def root(): session.clear() form = forms.DataServersForm() form.dataserver.choices = zip (dataservers, dataservers) если form.validate_on_submit(): сессия [ 'DataServer'] = form.dataserver.data печати сессия [ 'DataServer'], form.dataserver.data обратный редирект (url_for ('Войти')) return render_template ('root.html', title = 'Sybase Load App', form = form) ' – bhudson

+0

Код не работает так хорошо в комментариях, пожалуйста, обновите свой вопрос. – dirn

+0

Спасибо за быстрый ответ. Я обновил вопрос/код. – bhudson

Смежные вопросы