首页 > 解决方案 > 带 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>

标签: pythonflaskflask-wtformswtforms

解决方案


问题是你在计算下一个猜测时只使用静态值,你从不使用用户输入的按钮!

class GuessForm(FlaskForm):

    min_a = 0
    max_a = 1000
    guess = int((max_a - min_a) / 2) + int(min_a)

min 始终为 0,max 始终为 1000,guess 始终为 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)

推荐阅读