Python 3.x 提交到Flask表单的所有内容都是一个字符串,它总是无法通过表单验证

Python 3.x 提交到Flask表单的所有内容都是一个字符串,它总是无法通过表单验证,python-3.x,flask,flask-wtforms,Python 3.x,Flask,Flask Wtforms,我试图设置一个基本的烧瓶表单,但意识到我提交给表单的所有内容都是作为字符串读入的: from flask import blueprints, render_template from flask import request from wtforms import Form, DecimalField, from wtforms.validators import NumberRange class PredictionForm(Form): inputfield =

我试图设置一个基本的烧瓶表单,但意识到我提交给表单的所有内容都是作为字符串读入的:

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'))))

我认为这就是我的表单验证不断返回false的原因,因为很明显,任何字符串值都不是0到1之间的数字。如何让Flask将输入值识别为数字

如果这不是我的验证失败的原因,请也让我知道


注意:我正在打印要调试的
request.form
,这样我就可以看到什么类型的数据被传递到我的表单中。我知道我可以通过执行以下操作在服务器端清楚地进行验证

输入字段=请求。表单['input\u field'] 如果输入_字段.isnumber(): ... 更多的逻辑

然而,所有这些都发生在后端服务器端。使用这些烧瓶验证器的全部意义在于,我不需要在服务器端执行此验证。例如,如果我更改了一个名为
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()])
这在我的前端工作得非常好,因为如果我尝试在没有支出输入的情况下提交表单,我会收到以下消息:
我只是对你想要达到的目标感到困惑。为什么要打印请求表 如果您想传递表单参数,如电子邮件,请致电\u no至flask,您可以这样做

email = request.form['email']
phone_no = request.form['phone_no']
例如,如果您想验证电话号码是否为否 你能行

if not phone_no.isdigit():
    print ("phone no must be numbers")
因此,您发送表单参数的代码(例如电子邮件和电话号码)如下所示。您可以沿向下执行其他检查 代码

更新了我答案的部分:

如果您正在验证数字,它应该是integerfield。还要检查以确保该字段也在您的模型中

IntegerField('Telephone', [validators.NumberRange(min=0, max=10)]

请参阅文档

我发现了我的问题-我没有将
请求传递给我的
预测表单
实例化:

@blueprint.route("/", methods=["POST", "GET"])
def index():
    form = PredictionForm(request.form)
    form.validate() # this validates correctly now!

在前端,如果用户没有为
Decimal
值输入有效的数字,他/她将收到一条错误消息。

您可以添加错误日志吗?@Reactive\u learner没有错误日志-我已经从控制台打印了我可以打印的内容。出于调试目的,我正在打印
请求.form
,因此,我可以看到传递到POST端点的数据类型。你的方法行得通,但它违背了我要做的事情的目的。Flask的验证器应该在前端处理此验证-在后端(服务器端)验证表单响应显然是一个选项,但不是我想要的。我已经更新了我的问题,以包含更多可能对答案更有用的示例。在前端,最好使用javascript或jquery/ajax。或者某种插件。您在代码中进行验证的方式是后端验证,而不是前端验证。对于表单的服务器端验证,您还可以检查WTForms库,它包含一些预定义的验证程序类。我在你的代码中看到了一个打字错误,我已经更新了我的答案,请查看我答案的更新部分,并让我知道它是如何进行的。打字错误是我刚刚快速键入了一个示例,非常抱歉!事实上,我刚刚弄明白了——见上面我的答案。
@blueprint.route("/", methods=["POST", "GET"])
def index():
    form = PredictionForm(request.form)
    form.validate() # this validates correctly now!