提交给 Flask Form 的所有内容都是一个字符串,它总是无法通过表单验证
Everything submitted to Flask Form is a string, which always fails form validation
我正在尝试设置一个基本的 Flask 表单,但意识到我提交给表单的所有内容都以字符串形式读入:
from flask import blueprints, render_template
from flask import request
from wtforms import Form, DecimalField,
from wtforms.validators import NumberRange
class PredictionForm(Form):
inputfield = DecimalField("Impressions", validators=[NumberRange(min=0.0, max=1.0, message="Not valid")
anotherinput = DecimalField('View Rate', validators=[NumberRange(min=0.0, max=1.0, message="Not valid")])
@blueprint.route("/", methods=["POST", "GET"])
def index():
form = PredictionForm()
print(request.form)
print(form.validate()) # this always returns False!
if request.method == "POST":
print(request.form)
当我打印 requests.form
时,我得到以下输出:
ImmutableMultiDict([('inputfield', '0'), ('anotherinput', '0.5'))])
我认为这就是为什么我的表单验证不断 returns 错误,因为显然任何字符串值都不是 0 到 1 之间的数字。如何让 Flask 将我的输入值识别为数字?
如果这不是我验证失败的原因,也请告诉我。
注意:我正在打印 request.form
进行调试 - 这样我就可以看到什么类型的数据正在传递到我的表单中。我知道我可以通过
之类的操作在服务器端清楚地验证
input_field = request.form['input_field']
如果 input_field.isnumber():
...更多逻辑
然而,所有这一切都发生在后端服务器端。使用这些 Flask 验证器的全部意义在于我不需要在服务器端执行此验证。例如,如果我更改对名为 spend
:
的字段的验证
class PredictionForm(Form):
inputfield = DecimalField("Impressions", validators=[NumberRange(min=0.0, max=1.0, message="Not valid")
anotherinput = DecimalField('View Rate', validators=[NumberRange(min=0.0, max=1.0, message="Not valid")])
spend = DecimalField('Spend', validators=[DataRequired()])
这在我的前端完美运行,因为如果我尝试提交我的表单而不输入支出,我会收到此消息:
我只是对您要实现的目标感到困惑。你为什么打印 request.form
如果你想传递表单参数,例如电子邮件,phone_no 到烧瓶你可以这样做
email = request.form['email']
phone_no = request.form['phone_no']
如果您想验证例如 phone_no 是否
你可以做到
if not phone_no.isdigit():
print ("phone no must be numbers")
所以您发送表单参数的代码,例如 email 和 phone_no 看起来像。您可以执行其他检查
代码
@blueprint.route("/", methods=["POST", "GET"])
def index():
form = PredictionForm()
print(request.form)
print(form.validate()) # this always returns False!
if request.method == "POST":
print(request.form)
email = request.form['email']
phone_no = request.form['phone_no']
更新了我的回答部分:
如果您要验证数字,则它应该是整数字段。还要检查以确保该字段也在您的模型中
IntegerField('Telephone', [validators.NumberRange(min=0, max=10)]
查看文档 link
我发现了我的问题 - 我没有将 request.form
传递给我的 PredictionForm
实例化:
@blueprint.route("/", methods=["POST", "GET"])
def index():
form = PredictionForm(request.form)
form.validate() # this validates correctly now!
在前端,如果用户没有为 Decimal
值输入有效数字,he/she 将收到一条错误消息。
我正在尝试设置一个基本的 Flask 表单,但意识到我提交给表单的所有内容都以字符串形式读入:
from flask import blueprints, render_template
from flask import request
from wtforms import Form, DecimalField,
from wtforms.validators import NumberRange
class PredictionForm(Form):
inputfield = DecimalField("Impressions", validators=[NumberRange(min=0.0, max=1.0, message="Not valid")
anotherinput = DecimalField('View Rate', validators=[NumberRange(min=0.0, max=1.0, message="Not valid")])
@blueprint.route("/", methods=["POST", "GET"])
def index():
form = PredictionForm()
print(request.form)
print(form.validate()) # this always returns False!
if request.method == "POST":
print(request.form)
当我打印 requests.form
时,我得到以下输出:
ImmutableMultiDict([('inputfield', '0'), ('anotherinput', '0.5'))])
我认为这就是为什么我的表单验证不断 returns 错误,因为显然任何字符串值都不是 0 到 1 之间的数字。如何让 Flask 将我的输入值识别为数字?
如果这不是我验证失败的原因,也请告诉我。
注意:我正在打印 request.form
进行调试 - 这样我就可以看到什么类型的数据正在传递到我的表单中。我知道我可以通过
input_field = request.form['input_field'] 如果 input_field.isnumber(): ...更多逻辑
然而,所有这一切都发生在后端服务器端。使用这些 Flask 验证器的全部意义在于我不需要在服务器端执行此验证。例如,如果我更改对名为 spend
:
class PredictionForm(Form):
inputfield = DecimalField("Impressions", validators=[NumberRange(min=0.0, max=1.0, message="Not valid")
anotherinput = DecimalField('View Rate', validators=[NumberRange(min=0.0, max=1.0, message="Not valid")])
spend = DecimalField('Spend', validators=[DataRequired()])
这在我的前端完美运行,因为如果我尝试提交我的表单而不输入支出,我会收到此消息:
我只是对您要实现的目标感到困惑。你为什么打印 request.form 如果你想传递表单参数,例如电子邮件,phone_no 到烧瓶你可以这样做
email = request.form['email']
phone_no = request.form['phone_no']
如果您想验证例如 phone_no 是否 你可以做到
if not phone_no.isdigit():
print ("phone no must be numbers")
所以您发送表单参数的代码,例如 email 和 phone_no 看起来像。您可以执行其他检查 代码
@blueprint.route("/", methods=["POST", "GET"])
def index():
form = PredictionForm()
print(request.form)
print(form.validate()) # this always returns False!
if request.method == "POST":
print(request.form)
email = request.form['email']
phone_no = request.form['phone_no']
更新了我的回答部分:
如果您要验证数字,则它应该是整数字段。还要检查以确保该字段也在您的模型中
IntegerField('Telephone', [validators.NumberRange(min=0, max=10)]
查看文档 link
我发现了我的问题 - 我没有将 request.form
传递给我的 PredictionForm
实例化:
@blueprint.route("/", methods=["POST", "GET"])
def index():
form = PredictionForm(request.form)
form.validate() # this validates correctly now!
在前端,如果用户没有为 Decimal
值输入有效数字,he/she 将收到一条错误消息。