Все, что отправлено в форму Flask, является строкой, которая всегда не проходит проверку формы - PullRequest
1 голос
/ 17 апреля 2019

Я пытаюсь настроить базовую форму колбы, но понимаю, что все, что я отправляю в форму, читается как строка:

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_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()])

Это прекрасно работает на моем веб-интерфейсе, так как, если я пытаюсь отправить свою форму без ввода затрат, я получаю это сообщение: enter image description here

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Я просто запутался в том, что вы пытаетесь достичь. почему вы печатаете request.form если вы хотите передать параметры формы, например, email, 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)]

см. Документацию ссылка

0 голосов
/ 17 апреля 2019

Я нашел свою проблему - я не передаю request.form моему PredictionForm экземпляру:

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

Если во внешнем интерфейсе пользователь не введет действительное число для значения Decimal, он получит сообщение об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...