#python #flask #flask-wtforms
Вопрос:
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>
Ответ №1:
Вы пробовали печатать ошибку После попытки оператора if 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>
Комментарии:
1. я пробовал использовать
form.errors
, но я не получаю никаких ошибок, напечатанных вообще. Это то же самое, что и раньше, и я перенаправляюсь наhome.html
страницу без каких-либо ошибок.2. где вы печатаете форму.ошибки, можете ли вы обновить код с помощью текущего кода, который вы используете
3. дело сделано. я добавил его сразу после утверждения if, как вы сказали
4. нет , вам не нужно добавлять его сюда , я имею в виду, что после области действия оператора if я обновил ответ, вы можете видеть
5. это то же самое, даже после изменения местоположения
form.errors
кода