FlaskForm не может предоставить данные - PullRequest
0 голосов
/ 01 декабря 2018

Я использую Flask-WTF для отправки данных в форму, но я не могу получить никаких данных при отправке формы.Это мой класс LoginForm:

class LoginForm(FlaskForm):
    username=StringField('Username')
    password=PasswordField('Password')

    def validate(self):

        check_validate = super(LoginForm, self).validate()

        if not check_validate:
            return False
        logging.error('username is %s'%(self.username)
        user=User.query.filter_by(username=self.username.data).first()
        if not user:
            logging.error('username %s: Invalid username or password'%self.username.data)
            self.username.errors.append(
                'Invalid username or password'
            )

            return False

        if not user.checkPassword(self.password.data):
            logging.error('password %s:Invalid username or password'%self.password.data)
            self.username.errors.append(
                'Invalid username or password'
            )

            return False

        return True

А вот моя форма:

{% extends 'base.html' %}
{% from 'base.html' import input %}
{% block title %}Login{% endblock %}
{% block body %}
    <form method='POST' action="{{ url_for('main.login')}}">
        {{ form.hidden_tag() }}
        {{ input(form.username, 'Username') }}
        {{ input(form.password, 'Password') }}
        <input class='btn-primary' type='submit' value='Login'>
    </form>
{% endblock %}

входной файл представляет собой макрос jinaja, содержащий

{% macro input(name, label, value='', type='text') %}
    <div class="form-group">
        <label for='{{ name }}'>{{ label }}</label>
        <input type='{{ type }}' name='{{ name }}' value='{{ value | escape }}' class='form-control'>
    </div>

{% endmacro %}

, поэтому, когда явведите некоторые данные в этой форме и отправьте, я всегда видел

ОШИБКА: root: username is

Похоже, что данные не были переданы в LoginForm

Что мне делать?

@main_blueprint.route('/login', methods=('GET','POST'))
def login():
    form = LoginForm()

    if form.validate_on_submit():
        flash("Your have been logged in.", category="success")
        user = User.query.filter_by(username=form.username.data).first()
        return render_template(
            'user.html',
            user=user
        )
    return render_template('login.html', form = form)

main_blueprint = Blueprint(
    'main',
    __name__,
    template_folder='../templates/main'
)

new: я пытался отправить свою форму методом 'GET' и обнаружил, что мое имя пользователя и пароль были переданы, но я все еще не могу получить их в LoginForm

127.0.0.1 - - [02/Dec/2018 01:05:18] "GET /login?csrf_token=...input+ 
id%3D%22username%22+
name%3D%22username%22+
type%3D%22text%22+
value%3D%22%22%3E=mer&%3C
input+
id%3D%22password%22+
name%3D%22password%22+
type%3D%22password%22+
value%3D%22%22%3E=dly1234&
submit=Login+In HTTP/1.1" 200 -

'mer' и 'dly1234' - это введенные мной имя пользователя и pwd.

1 Ответ

0 голосов
/ 02 декабря 2018

Вопрос был решен, я прочитал HTML-код страницы входа и обнаружил в моей последней версии input в форме:

<div class="form-group">
    <label for='<input id="username" name="username" type="text" value="">'>Username</label>
    <input type='text' name='<input id="username" name="username" type="text" value="">' value='' class='form-control'>
</div>

Я заметил, что имя в этом странно, поэтому я вернулсяизменить мой дзиндзя:

раньше:

{{ input(form.username, 'Username') }}

сейчас:

 {{ input('username', 'Username') }}

Конец вопроса.

И спасибо @kosist,Учебник Mega дает мне много полезного, его метод реализации вдохновил меня сравнить разницу между нашим окончательным HTML-кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...