【问题标题】:Form Doesn't Validate and there are No Errors. CSRF Token Included表单不验证并且没有错误。包含 CSRF 令牌
【发布时间】:2019-05-03 00:18:31
【问题描述】:

我正在开发一个带有一些烧瓶 wtform 的烧瓶应用程序。当我收到表单时,它们从未经过验证,但表单错误为空。我的问题可能是什么?

我知道我没有的一个常见问题是包含 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 的事情有关

谢谢!

【问题讨论】:

    标签: python flask flask-wtforms


    【解决方案1】:

    我不相信替代答案是正确的。我有很多 FlaskForms 没有通过请求。

    相反,我认为您的错误可能出在您的命名约定中。您的类字段名称是:

    'oldpassword' 'newpassword' etc..
    

    但您的 HTML 元素 ID 和名称是:

    'old-password' 'new-password'
    

    即表单不知道要解析什么。对齐你的名字..

    【讨论】:

    • 非常感谢!这有效,虽然我不能:python old-password= 左侧符号上的任何其他内容,因为它将减号作为运算符。所以我只是将我的html文件中的名称更改为没有'-'。我在文档中没有找到这些东西必须匹配的任何地方。也许我会考虑把它写下来。无论如何,再次感谢您的帮助
    【解决方案2】:

    在您的 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 crash course(以及更多内容)以了解 WTForms 可以做什么 - 它非常有用。

    【讨论】:

    • 只是为了澄清你使用的是flask-wtf还是wtforms?我问是因为您提供的链接只是 wtforms,我不确定这与 flask-wtf 有何不同。它似乎仍然没有为我验证。除了将请求表单传递给 Form 对象之外,我还有什么明显的遗漏吗?
    猜你喜欢
    • 2022-07-12
    • 2015-12-23
    • 2016-09-09
    • 1970-01-01
    • 2011-09-25
    • 2014-07-12
    • 2018-02-20
    • 2012-09-16
    • 2011-12-11
    相关资源
    最近更新 更多