表单未验证且没有错误。包含 CSRF 令牌
Form Doesn't Validate and there are No Errors. CSRF Token Included
我正在使用一些 flask wtforms 开发一个 flask 应用程序。当我收到表格时,它们从未经过验证,但表格错误是空的。我的问题可能是什么?
我知道我没有遇到的一个常见问题是 csrf_token。我包含了它,当我的网页加载时,可以看到它呈现在 html 中。但是none越少就没有验证
这是我正在渲染的 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})
这是我正在使用的表格class
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()])
查看浏览器中的网络选项卡,它正在 post 请求中发送预期结果,如果我检查后端,它会按预期接收所有内容。不幸的是,该表格无论如何都无法验证,因此我希望它与我不了解 wtforms
的东西有关
谢谢!
在您的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 的功能 - 它非常有用。
我认为备选答案不正确。我有很多 FlaskForms 我没有通过请求。
相反,我认为您的错误可能出在您的命名约定中。您的 Class 字段名称是:
'oldpassword' 'newpassword' etc..
但是您的 HTML 元素 ID 和名称是:
'old-password' 'new-password'
即表单不知道要解析什么。对齐你的名字..
我正在使用一些 flask wtforms 开发一个 flask 应用程序。当我收到表格时,它们从未经过验证,但表格错误是空的。我的问题可能是什么?
我知道我没有遇到的一个常见问题是 csrf_token。我包含了它,当我的网页加载时,可以看到它呈现在 html 中。但是none越少就没有验证
这是我正在渲染的 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})
这是我正在使用的表格class
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()])
查看浏览器中的网络选项卡,它正在 post 请求中发送预期结果,如果我检查后端,它会按预期接收所有内容。不幸的是,该表格无论如何都无法验证,因此我希望它与我不了解 wtforms
的东西有关谢谢!
在您的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 的功能 - 它非常有用。
我认为备选答案不正确。我有很多 FlaskForms 我没有通过请求。
相反,我认为您的错误可能出在您的命名约定中。您的 Class 字段名称是:
'oldpassword' 'newpassword' etc..
但是您的 HTML 元素 ID 和名称是:
'old-password' 'new-password'
即表单不知道要解析什么。对齐你的名字..