Хорошо, я исправлю ваш код. Первым делом это результат:
Flask Код:
from flask import Flask, request, render_template, url_for, flash, redirect
from wtforms import SubmitField, Form, FloatField, validators
app = Flask(__name__)
app.config['SECRET_KEY'] = 'dev'
def mul(A,B):
return A*B
def add(A,B):
return A+B
# Form
class InputForm(Form):
A = FloatField(
label='A', default=0,
validators=[validators.InputRequired()])
B = FloatField(
label='B', default=0,
validators=[validators.InputRequired()])
@app.route('/comp', methods=['GET', 'POST'])
@app.route('/', methods=['GET', 'POST']) #this so that both url will work
def comp():
result = '' #already assign a variable, else will throw error
form = InputForm(request.form)
if request.method == 'POST': #First we check if method is post **POINT 2**
if form.validate(): #Then if form is validate
print('form ok') #Test if form is ok
if request.form['btn'] == 'Add':
result = add(form.A.data, form.B.data)
print(result)
elif request.form['btn'] == 'Multiply':
result = mul(form.A.data, form.B.data)
print(result)
flash(result) # **POINT 3**
return redirect('comp') # This will make your code run forever #**4**
else:
print('form no ok ') #check if form no ok
else:
print('request is get') # if you put the form.validate with the method condition, the form will return False as soons as you render the template
return render_template('view.html', form=form, result=result)
if __name__ == '__main__':
app.run(debug=True)
HTML файл:
<form method="post" action="">
<table>
<!-- Generates form fields -->
<!-- POINT 1 -->
{% for field in form %}
<td>{{ field.name }}</td><td>{{ field }}</td>
<td>{{ field.label }}</td>
</tr>
{% endfor %}
<tr>
<!-- Input are inside the form tag -->
<td><input type="submit" name="btn" value="Add"></td>
<td><input type="submit" name="btn" value="Multiply"></td>
</tr>
</table>
</form>
<!-- Print result in the browser -->
<!-- Needs to redirect to the same page -->
<!-- return redirect('comp') -->
{% for msg in get_flashed_messages()%}
<h1> {{msg}} </h1>
{% endfor%}
- Итак, основная проблема заключалась в том, что в HTML форма не вместе с полем ввода, поэтому форма разрабатывалась отдельно. Если сложить все вместе, он начнет работать.
В файле python условие if request.method == 'POST' выполняется одновременно с формой, следовательно, форма возвращается False даже перед ее отправкой.
.3 Добавлен метод Fla sh, чтобы вы могли видеть результат
.4 Добавьте перенаправление, это отобразит sh результат в браузере, но самое главное обновит sh форму и даст вам возможность добавить новую.
Обратите внимание, что также важно перенаправить страницу, потому что представьте, если вы хотите зафиксировать ее в базе данных, это сделает вы отправляете форму и сохраняете изменения.