【问题标题】:flask wtform validation fails烧瓶 wtform 验证失败
【发布时间】:2021-07-14 19:36:06
【问题描述】:
class FlowerForm(FlaskForm):
    cr_score = IntegerField('Credit Score', validators=[DataRequired()])
    geo = StringField('Geography', validators=[DataRequired()])
    gen = StringField('Gender', validators=[DataRequired()])
    age = IntegerField('Age', validators=[DataRequired()])
    ten = IntegerField('Tenure', validators=[DataRequired()])
    bal = IntegerField('Balance', validators=[DataRequired()])
    num = IntegerField('Number Of Products', validators=[DataRequired()])
    has_card = IntegerField('Has Credit Card', validators=[DataRequired()])
    is_active = IntegerField('Is Active Member', validators=[DataRequired()])
    sal = IntegerField('Estimated Salary', validators=[DataRequired()])
    
    submit = SubmitField('Analyze')

@app.route('/', methods=['GET', 'POST'])
def index():
    # Create instance of the form.
    form = FlowerForm(request.form)
    # If the form is valid on submission
    if request.method == "POST" and form.validate_on_submit():
   
        # Grab the data from the input on the form.
        session["cr_score"] = form.cr_score.data
        session["geo"] = form.geo.data
        session["gen"] = form.gen.data
        session["age"] = form.age.data
        session["ten"] = form.ten.data
        session["bal"] = form.bal.data
        session["num"] = form.num.data
        session["has_card"] = form.has_card.data
        session["is_active"] = form.is_active.data
        session["sal"] = form.sal.data
        
        return redirect(url_for("prediction"))
    print(form.errors)
    return render_template('home.html', form=form)

@app.route('/prediction')
def prediction():
    #Defining content dictionary
    content = {}
    
    content["CreditScore"] = int(session["cr_score"])
    content["Geography"] = str(session["geo"])
    content["Gender"] = str(session["gen"])
    content["Age"] = int(session["age"])
    content["Tenure"] = int(session["ten"])
    content["Balance"] = int(session["bal"])
    content["NumOfProducts"] = int(session["num"])
    content["HasCrCard"] = int(session["has_card"])
    content["IsActiveMember"] = int(session["is_active"])
    content["EstimatedSalary"] = int(session["sal"])


    results = return_prediction(model = model, scaler = scaler, onehot = ohencoder, lab_enc=labencoder, sample_json = content)
    return render_template('prediction.html',results=results)

表单验证似乎在这里不起作用。 我也试过form.valid_on_submit

我的 home.html 文件和 prediction.html 文件都包含form.hidden_tag()

if 语句以某种方式被覆盖,我最终回到主页

HTML home.html 代码:

<h1>Welcome to Customer Retention Prediction</h1>
<h2>Please enter customer details below:</h2>
<form action = "/" method=”POST”>
 {# This hidden_tag is a CSRF security feature. #}
 {{form.hidden_tag()}}
 {{ form.csrf_token }}
 {{form.cr_score.label}} {{form.cr_score}}
 <br>
 {{form.geo.label}} {{form.geo}}
 <br>
 {{form.gen.label}} {{form.gen}}
 <br>
 {{form.age.label}} {{form.age}}
 <br>
 {{form.ten.label}} {{form.ten}}
 <br>
 {{form.bal.label}} {{form.bal}}
 <br>
 {{form.num.label}} {{form.num}}
 <br>
 {{form.has_card.label}}{{form.has_card}}
 <br>
 {{form.is_active.label}} {{form.is_active}}
 <br>
 {{form.sal.label}} {{form.sal}}
 <br>
 {{form.submit()}}
</form>

prediction.html代码:

<h1>Thank You.</h1>
 {# This hidden_tag is a CSRF security feature. #}
 {{form.hidden_tag()}}
<h2>Probability of this customer leaving the bank is: {{results}}</h2>

【问题讨论】:

    标签: python flask flask-wtforms


    【解决方案1】:

    您是否尝试过打印错误 在 if 语句 try print(form.errors) 之后,它应该会给你错误 no crsf token

    在 html 中添加你使用 form.hidden_tag() 的地方 在它下面使用{{ form.csrf_token }}

    [...]
    if request.method == "POST" and form.validate():
            # Grab the data from the input on the form.
            session["cr_score"] = form.cr_score.data
            session["geo"] = form.geo.data
            session["gen"] = form.gen.data
            session["age"] = form.age.data
            [....]
    print(form.errors)
    return render_template('home.html', form=form)
    

    编辑:您没有在表单标签中使用操作。

    在html文件中:应该是这个

    <form action="/" method="POST">
    

    您的索引函数将是:

    @app.route('/', methods=['GET', 'POST'])
    def index():
        # Create instance of the form.
        form = FlowerForm(request.form)
        # If the form is valid on submission
        if request.method == "POST":
            print("yoyo")
            if form.validate_on_submit():
                
                # Grab the data from the input on the form.
                session["cr_score"] = form.cr_score.data
                session["geo"] = form.geo.data
                session["gen"] = form.gen.data
                session["age"] = form.age.data
                session["ten"] = form.ten.data
                session["bal"] = form.bal.data
                session["num"] = form.num.data
                session["has_card"] = form.has_card.data
                session["is_active"] = form.is_active.data
                session["sal"] = form.sal.data
                
                return redirect(url_for("prediction"))
        print(form.errors)
        return render_template('home.html', form=form)
    

    您的 home.html 将是:

    <h1>Welcome to Customer Retention Prediction</h1>
    <h2>Please enter customer details below:</h2>
    <form action="/" method="POST">
     {# This hidden_tag is a CSRF security feature. #}
     {{form.hidden_tag()}}
    
     {{ form.csrf_token }}
     {{form.cr_score.label}} {{form.cr_score}}
     <br>
     {{form.geo.label}} {{form.geo}}
     <br>
     {{form.gen.label}} {{form.gen}}
     <br>
     {{form.age.label}} {{form.age}}
     <br>
     {{form.ten.label}} {{form.ten}}
     <br>
     {{form.bal.label}} {{form.bal}}
     <br>
     {{form.num.label}} {{form.num}}
     <br>
     {{form.has_card.label}}{{form.has_card}}
     <br>
     {{form.is_active.label}} {{form.is_active}}
     <br>
     {{form.sal.label}} {{form.sal}}
     <br>
     {{form.submit()}}
      {{form.errors}}
    </form>
    

    【讨论】:

    • 我尝试使用form.errors,但我没有打印任何错误。和以前一样,我被重定向到home.html 页面,没有任何错误。
    • 你在哪里打印form.errors,你能用你正在使用的当前代码更新代码
    • 完成了。我就像你说的那样在 if 语句之后添加了它
    • 不,你不必在这里添加它,我的意思是在if语句范围之后,我更新了答案,你可以看到
    • form.errors代码的位置改了还是一样
    猜你喜欢
    • 2016-12-26
    • 2021-02-11
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 2014-04-11
    • 1970-01-01
    相关资源
    最近更新 更多