【发布时间】:2020-12-26 18:30:05
【问题描述】:
我正在尝试在某些变量上使用 flask-wtf 表单验证器。表单验证的所有示例都使用实际表单进行验证。我想在没有表单的几个变量上使用验证器。下面是sn-ps。我试过这种方法,但没有用。我在 form.validate() 上得到 False 并且我得到 [] 错误列表。请指导我正确的流程。
#this is my form_validations.py
#########################################################################################################
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField
from wtforms.validators import DataRequired, Email, Length
class SignUpForm(FlaskForm):
username = StringField('username', validators=[DataRequired(), Length(min=1, max=50)])
email = StringField('email', validators=[DataRequired(), Email()])
mobile = StringField('mobile', validators=[DataRequired(), Length(min=10, max=15)])
#########################################################################################################
#this is the function where I want to use the form validations.
def userSignUp():
username = request.form['username']
email = request.form['email']
mobile = request.form['mobile']
form = {
"username" : str(username),
"email": str(email),
"mobile": str(mobile)
}
formData = MultiDict(mapping=form)
print(formData)
form = SignUpForm(formData)
if form.validate():
output = {"result": "success"}
else:
output = {"result": "failed"}
# print(form.validate(),form.username.errors,form.email.errors,form.mobile.errors)
return jsonify(output)
【问题讨论】:
-
你设置CSRF with Flask-WTForms了吗?如果 CSRF 令牌有问题,则字段错误将为空。
-
@KarlSutt 是的,我认为这是 csrf_token 问题。我现在可以看到 form.errors 中缺少 csrf_token。你知道如何解决这个问题吗?我在本地主机上运行烧瓶并使用静态 html 文件 file:///C:/Users/hellohackers/Documents/GitHub/myapps/routes_use/signup.html 中的 api。我已经设置了烧瓶仍然存在 csrf 问题的 CSRF。
-
如果您已经按照docs 中的描述设置了 CSRF,也许您在提交表单时没有发送令牌?您的 HTML 表单应包含对
{{ form.csrf_token }}的调用。 -
@KarlSutt iam 没有使用 form.csrf_token 因为最后我只会将flask api用于移动应用程序。我是否必须先向客户端发送 csrf_token,然后对于其他请求,客户端需要向我发送 csrf_token 以进行 api 调用?
-
啊哈,明白了。在这种情况下,我会放弃 Flask-WTF 并直接使用 WTForms。您可以在表单类定义中只使用
from wtforms import Form而不是from flask_wtf import FlaskForm并将FlaskForm替换为Form。其他一切都应该按原样工作。请务必查看this post,了解 REST API 安全性。
标签: python flask flask-wtforms wtforms