带 wtforms 的反向数字猜测烧瓶
reverse number guess flask w/ wtforms
在花了最后几天时间之后,我想是时候问问别人了。
基本上我试图在 Flask 中使用 WTForms 进行反向数字猜测,但我遇到了它只工作一次的问题:即提交表单只给出一次结果。
我 运行 没主意了。将不胜感激任何提示:)
from flask import Flask, render_template
from flask_wtf import FlaskForm
from wtforms import SubmitField, HiddenField
app = Flask(__name__)
app.config['SECRET_KEY'] = "SoSecret"
class GuessForm(FlaskForm):
min_a = 0
max_a = 1000
guess = int((max_a - min_a) / 2) + int(min_a)
pred = SubmitField(guess)
more = SubmitField('more')
less = SubmitField('less')
gjob = SubmitField('gjob')
minn = HiddenField('min', default=min_a)
maxx = HiddenField('max', default=max_a)
@app.route('/form', methods=['GET', 'POST'])
def form():
form = GuessForm()
render_template("form.html", form=form)
if form.more.data and form.validate():
form.max_a = form.guess
form.guess = int((form.max_a - form.min_a) / 2) + int(form.min_a)
return render_template("form.html", form=form)
elif form.less.data:
pass
elif form.gjob.data:
pass
return render_template("form.html", form=form)
if __name__ == '__main__':
app.run(debug=True)
和 html 文件:
<body>
<form method='POST' action='{{ url_for('form') }}'>
{{ form.csrf_token }}
I guess the number is {{ form.guess }}
{{ form.more }}
{{ form.less }}
{{ form.gjob }}
{{ form.minn }}
{{ form.maxx }}
</form>
</body>
问题是你在计算下一个猜测时只使用静态值,你永远不会使用用户输入的按钮!
class GuessForm(FlaskForm):
min_a = 0
max_a = 1000
guess = int((max_a - min_a) / 2) + int(min_a)
最小值始终为 0,最大值始终为 1000,猜测值始终为 500。
这边:
form.max_a = form.guess
form.guess = int((form.max_a - form.min_a) / 2) + int(form.min_a)
您使用的只是最小值、最大值和猜测值,我们确定它们已经是静态的,因此您实际上并没有使用用户提供的新信息,因此您总是看到相同的猜测值。
您需要访问、使用和更新您已经创建的隐藏字段。
我花了一些时间来修复路线,现在它的效果与预期的差不多:
@app.route('/form', methods=['GET', 'POST'])
def form():
form = GuessForm()
if form.validate():
if form.more.data:
form.minn.data = int((int(form.maxx.data) + int(form.minn.data)) / 2)
elif form.less.data:
form.maxx.data = int((int(form.minn.data) + int(form.maxx.data)) / 2)
else:
return 'yay'
form.guess = int(int(form.maxx.data) - int(form.minn.data)) / 2 + (int(form.minn.data))
return render_template("form.html", form=form)
在花了最后几天时间之后,我想是时候问问别人了。
基本上我试图在 Flask 中使用 WTForms 进行反向数字猜测,但我遇到了它只工作一次的问题:即提交表单只给出一次结果。
我 运行 没主意了。将不胜感激任何提示:)
from flask import Flask, render_template
from flask_wtf import FlaskForm
from wtforms import SubmitField, HiddenField
app = Flask(__name__)
app.config['SECRET_KEY'] = "SoSecret"
class GuessForm(FlaskForm):
min_a = 0
max_a = 1000
guess = int((max_a - min_a) / 2) + int(min_a)
pred = SubmitField(guess)
more = SubmitField('more')
less = SubmitField('less')
gjob = SubmitField('gjob')
minn = HiddenField('min', default=min_a)
maxx = HiddenField('max', default=max_a)
@app.route('/form', methods=['GET', 'POST'])
def form():
form = GuessForm()
render_template("form.html", form=form)
if form.more.data and form.validate():
form.max_a = form.guess
form.guess = int((form.max_a - form.min_a) / 2) + int(form.min_a)
return render_template("form.html", form=form)
elif form.less.data:
pass
elif form.gjob.data:
pass
return render_template("form.html", form=form)
if __name__ == '__main__':
app.run(debug=True)
和 html 文件:
<body>
<form method='POST' action='{{ url_for('form') }}'>
{{ form.csrf_token }}
I guess the number is {{ form.guess }}
{{ form.more }}
{{ form.less }}
{{ form.gjob }}
{{ form.minn }}
{{ form.maxx }}
</form>
</body>
问题是你在计算下一个猜测时只使用静态值,你永远不会使用用户输入的按钮!
class GuessForm(FlaskForm):
min_a = 0
max_a = 1000
guess = int((max_a - min_a) / 2) + int(min_a)
最小值始终为 0,最大值始终为 1000,猜测值始终为 500。
这边:
form.max_a = form.guess
form.guess = int((form.max_a - form.min_a) / 2) + int(form.min_a)
您使用的只是最小值、最大值和猜测值,我们确定它们已经是静态的,因此您实际上并没有使用用户提供的新信息,因此您总是看到相同的猜测值。
您需要访问、使用和更新您已经创建的隐藏字段。
我花了一些时间来修复路线,现在它的效果与预期的差不多:
@app.route('/form', methods=['GET', 'POST'])
def form():
form = GuessForm()
if form.validate():
if form.more.data:
form.minn.data = int((int(form.maxx.data) + int(form.minn.data)) / 2)
elif form.less.data:
form.maxx.data = int((int(form.minn.data) + int(form.maxx.data)) / 2)
else:
return 'yay'
form.guess = int(int(form.maxx.data) - int(form.minn.data)) / 2 + (int(form.minn.data))
return render_template("form.html", form=form)