Проверка формы оценивается как False Flask

#python #flask #flask-wtforms

#python #flask #flask-wtforms

Вопрос:

Моя форма входа в систему очень похожа на эту, и она работает как шарм. Я просто не понимаю, почему form.validate_on_submit() выдает False. Как вы можете видеть, я использую print(form.errors) , чтобы посмотреть, что там происходит, но все, что я получаю, это пустой словарь, который не очень полезен.

У меня возникла проблема с этой регистрационной формой:

 @users.route('/register', methods=['GET', 'POST'])
def register():
    if request.method == 'POST':
        form = RegisterView(request.form)
        if form.validate_on_submit():
            user = User(
                first_name=form.first_name.data.title(),
                last_name=form.last_name.data.title(),
                email=form.email.data,
                mobile_number=form.mobile_number.data,
                city=form.city.data.title(),
                country=form.country.data,
                password=User.set_password(form.password.data),
            )
            db.session.add(user)
            db.session.commit()
            flash('Your account has been created. You can now log in.', 'success')
            return redirect(url_for('users.login'))
        else:
            print(form.errors)
    else:
        form = RegisterView()
    return render_template('users/register.html', title='Register User', 
                        form=form)
  

и это html:

 <div class='container'>
    <form action='' method='post'>
        {{ form.hidden_tag() }}
        <legend>Register User</legend>
        <fieldset class='form-group'>
            <div class='form-group'>
            {{ form.first_name(class='form-control', placeholder='First Name') }}
            {{ form.last_name(class='form-control', placeholder='Last Name') }}
            {{ form.email(class='form-control', placeholder='@') }}
            {{ form.mobile_number(class='form-control', placeholder='Mobile Number') }}
            {{ form.city(class='form-control', placeholder='City') }}
            {{ form.country(class='form-control') }}
            {{ form.password(class='form-control', placeholder='Password') }}
            {{ form.conf_password(class='form-control', placeholder='Confirm Password') }}
            </div>
        </fieldset>
        <div class='form-group'>
        {{ form.submit(class='btn btn-primary') }}amp;nbsp;
        <a href='{{ url_for("main.register") }}' id='btn' class='btn btn-warning'>Back</a>
    </div>
</form>
  

Подробнее:

 class Configuration:
    APPLICATION_DIR = os.path.dirname(os.path.realpath(__file__))
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'xyz'
    MAIL_SUBJECT_PREFIX = 'xyz'
    MAIL_SENDER = 'vtc@gmail.com'  # change this to use ProtonMail instead

    @staticmethod
    def init_app(app):
        pass


class DevelopmentConfig(Configuration):
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = 'xyz'
  

Комментарии:

1. является ли ваша hidden_tag() защита CSRF? в противном случае, если вы пропускаете это в своей форме и не игнорируете это, явно установив debug mode, произойдет сбой

2. @Attack68 Я добавил свой config.py файл, который вы можете увидеть. Я считаю, что атрибут debug не будет тем, что вызывает проблему здесь.

3. Я думаю, вам это может понадобиться WTF_CSRF_ENABLED = False , смотрите здесь flask-wtf.readthedocs.io/en/stable/config.html

Ответ №1:

Несколько моментов, которые следует иметь в виду:

  • это регистрационная форма, так зачем нужна строка form = RegisterView(request.form) ?
  • validate_on_submit несколько соответствует, request.method == 'POST' and form.validate() поэтому наличие validate_on_submit внутри request.method == 'POST' не имеет слишком большого смысла
  • Не уверен, что это уместно, но у вас есть запятая в конце строки password=User.set_password(form.password.data),
  • Я предполагаю, validate_on_submit что это false из-за токена csfr (тайм-аут / отсутствует), в stackoverflow есть сообщения об этом, хотя я не рекомендую помещать WTF_CSRF_ENABLED = False и забывать об этом

Вот как я бы это закодировал:

 @users.route('/register', methods=['GET', 'POST'])
def register():
    form = RegisterView()
    if form.validate_on_submit():
        user = User(
            first_name=form.first_name.data.title(),
            last_name=form.last_name.data.title(),
            email=form.email.data,
            mobile_number=form.mobile_number.data,
            city=form.city.data.title(),
            country=form.country.data,
            password=User.set_password(form.password.data))
        db.session.add(user)
        db.session.commit()
        flash('Your account has been created. You can now log in.', 'success')
        return redirect(url_for('users.login'))
    return render_template('users/register.html', title='Register User', 
                        form=form)