提交给 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 将收到一条错误消息。