Форма не проверяется и ошибок нет.CSRF токен включен - PullRequest
0 голосов
/ 01 мая 2019

Я работаю над приложением для колб с несколькими формами колб.Когда я получаю формы, они никогда не проверяются, но ошибки формы остаются пустыми.В чем может быть моя проблема?

Одна распространенная проблема, о которой я не знаю, это включение csrf_token.Я включил его и вижу, что он отображается в HTML, когда моя веб-страница загружается.Но, тем не менее, нет проверки

Это мой HTML-файл отображается

<div class="forms center">
    <h1>Account Details</h1>
    <h2>Update Email Address</h2>
    <form id="update-email" action={{ url_for('crud.update_email') }} method="post">
        {{ email_form.hidden_tag() }}
        <div><input type="text" name="new-email" placeholder="new email address" value=""></div>
        <div><input type="submit" name="submit" value="Update Email Address"></div>
    </form>
    <h2>Update Password</h2>
    <form id="update-password" action={{ url_for('crud.update_password') }} method="post">
        {{ password_form.hidden_tag() }}
        <div><input type="password" name="old-password" placeholder="enter old password" id="old-password" value=""></div>
        <div><input type="password" name="new-password" placeholder="enter new password" id="new-password" value=""></div>
        <div><input type="password" name="retypepassword" placeholder="retype password" id="retypepassword" value=""></div>
        <div><input type="submit" name="submit" id="submit" value="Update Password"></div>
    </form>
</div>

И он отображается на этом маршруте

@views.route('/account-details', methods=['POST', 'GET'])
@login_required
def account_details():
    email_form = UpdateEmailForm()
    password_form = UpdatePasswordForm()
    return render_template('account-details.html', email_form=email_form, password_form=password_form)

Отправкаформа для обновления пароля находится здесь

@crud.route('/update-password', methods=['POST'])
def update_password():
    form = UpdatePasswordForm()
    old_password = request.form.get('old-password')
    new_password = pbkdf2_sha256.hash(request.form.get('new-password'))
    userid = session.get('userid')
    user_dao = UserDao()

    if form.validate_on_submit():
        user_dao.update_password(userid, new_password)
        return jsonify({"success": True})
    return jsonify({"success": False})

Вот класс формы, который я использую

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, validators
from wtforms.validators import DataRequired, Email, EqualTo, Length, ValidationError

class UpdatePasswordForm(FlaskForm):
    oldpassword = PasswordField('old-password', [DataRequired()])
    newpassword = PasswordField('new-password', [DataRequired(), EqualTo('retypepassword'), Length(min=6)])
    retypepassword = PasswordField('retypepassword', [DataRequired()])

При просмотре вкладки сети в браузере она отправляет ожидаемые результаты в сообщениизапрос, и если я проверяю на серверной части, он получает все, как ожидалось.К сожалению, форма не проверяется в любом случае, и по этой причине я ожидаю, что это связано с чем-то, чего я не понимаю в wtforms

Спасибо!

Ответы [ 2 ]

2 голосов
/ 02 мая 2019

Я не верю, что альтернативный ответ будет правильным.У меня есть много FlaskForms, где я не передаю запрос.

Вместо этого я думаю, что ваша ошибка может заключаться в соглашении об именах.Ваши имена полей класса:

'oldpassword' 'newpassword' etc..

, но ваши идентификаторы и имена HTML-элементов:

'old-password' 'new-password'

Т.е. форма не знает, что анализировать.Выровняйте свои имена ..

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

В вашем POST вам нужно передать данные запроса в форму:

form = UpdatePasswordForm(request.POST)

Вам не нужно получать значения из request.form, и вы можете проверить их перед обновлением:

@crud.route('/update-password', methods=['POST'])
def update_password():
    form = UpdatePasswordForm(request.POST)

    if form.validate_on_submit():
        userid = session.get('userid')
        user_dao = UserDao()

        new_password = pbkdf2_sha256.hash(form.newpassword.data)
        user_dao.update_password(userid, new_password)
        return jsonify({"success": True})
    return jsonify({"success": False})

Редактировать: я настоятельно рекомендую прочитать ускоренный курс WTForms (и более), чтобы получить хорошее представление о том, что может делать WTForms - это очень полезно.

...