Python form.validate_on_submit () всегда false - PullRequest
1 голос
/ 20 мая 2019

Я использую flask_wtf

, это моя форма для входа

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, SubmitField
from wtforms.validators import DataRequired, Length


class LoginForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired()])
    password = PasswordField('Password', validators=[DataRequired(), Length(8, 128)])
    remember = BooleanField('Remember me')
    submit = SubmitField('Log in')

, это мой login.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login</title>
</head>
<body>
<form method="POST" action="">
    {{ form.csrf_token }}
    {{ form.username.label }}<br>{{ form.username }}<br>
    {{ form.password.label }}<br>{{ form.password }}<br>
    {{ form.remember }}{{ form.remember.label }}<br>
    {{ form.submit }}<br>
</form>
</body>
</html>

и мой app.py

from flask import Flask, render_template
from forms import LoginForm

app = Flask(__name__)
app.secret_key = 'learnflask'
@app.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        username = form.username.data
        print(username)
    return render_template('login.html', form=form)


if __name__ == '__main__':
    app.run(debug=True)

Моя проблема в том, что имя пользователя не печатается.кажется, что форма входа в систему не должна быть передана, form.validate_on_submit () имеет значение false.

Ответы [ 2 ]

1 голос
/ 20 мая 2019

Для поля password вы установили валидатор, чтобы проверить, находится ли длина между 8 и 128. Если пользователь дает пароль с меньшей или большей длиной, проверка будет неудачной. Я думаю, что это причина, почему form.validate_on_submit() всегда ложно.

Я показал сообщение об ошибке в шаблоне и получил ошибку.

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login</title>
    <style>
        .validation_error{
        color: red;
    }
    </style>
</head>
<body>
<form method="POST" action="">
    {{ form.csrf_token }}
    {{ form.username.label }}<br>{{ form.username }}<span class="validation_error">{{ ', '.join(form.username.errors) }}</span><br>
    {{ form.password.label }}<br>{{ form.password }}<span class="validation_error">{{ ', '.join(form.password.errors) }}</span><br>
    {{ form.remember }}{{ form.remember.label }}<span class="validation_error">{{ ', '.join(form.remember.errors) }}</span><br>
    {{ form.submit }}<br>
</form>
</body>
</html>

app.py:

from flask import Flask, render_template
from forms import LoginForm

app = Flask(__name__)
app.secret_key = 'learnflask'
@app.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        username = form.username.data
        return username
    return render_template('login.html', form=form)

Выход:

Допустимый ввод:

valid input

Неверный ввод:

invalid input

0 голосов
/ 20 мая 2019

form.validate_on_submit () имеет значение false, поскольку вы не добавили объект request.form в LoginForm ()

form = LoginForm(request.form)
...