werkzeug.exceptions.BadRequestKeyError 表单只有按钮

werkzeug.exceptions.BadRequestKeyError with forms with only buttons

我试图通过制作一个记录好零件、坏零件(带有报废代码)、缺失零件和时间变量的烧瓶应用程序来简化我的工作。

我在保存日志的页面上有多个“按钮”。 我目前正在尝试让页面重新加载当前按钮状态并在按下每个特定按钮时存储时间戳(在 python 脚本中)。

即我单击开始按钮,页面重新加载所有复选标记和按钮状态,并在脚本中存储一个 startTime 戳以供以后使用,然后禁用开始按钮。 如果我单击暂停按钮,页面将重新加载所有数据,并禁用暂停按钮并禁用停止按钮,直到再次单击暂停按钮(在脚本中存储时间戳)。 如果我单击停止按钮,结果页面将加载并以格式化的方式显示所有总计。

我搜索过、接触过、调试过、使用过开发者工具。前一分钟还可以,下一分钟就崩溃了。 目前,主页将加载,开始按钮工作和禁用。 当我点击停止时,它崩溃了。

Traceback (most recent call last)
File "\dev\furnace-log\__init__.py", line 115, in home
if request.method == 'POST' and request.form['startTime'] == 'Start':
File "\dev\furnace-log\venv\Lib\site-packages\werkzeug\datastructures.py", line 377, in __getitem__
raise exceptions.BadRequestKeyError(key)
werkzeug.exceptions.BadRequestKeyError: 400 Bad Request: The browser (or proxy) sent a request that this server could not understand.
KeyError: 'startTime'

这是按钮和表单的代码。 请注意,jinja 的一些“if”语句已在表单中删除。

<form method="post">
          {% if startBtnClicked == 1 %}
            <input class="btn btn-success" href="{{url_for('home')}}" type="submit" name="startTime" value="Start" disabled>
          {% else %}
            <input class="btn btn-success" href="{{url_for('home')}}" type="submit" name="startTime" value="Start">
          {% endif %}
          <input class="btn btn-warning" href="{{url_for('home')}}" type="submit" name="pauseTime" value="Pause">
          <input class="btn btn-danger" href="{{url_for('home')}}" type="submit" name="stopTime" value="Stop">
        </form>

这是家庭路线的代码。我让它打印以控制每个 if 分支的任何数据以供参考。

@app.route('/home', methods=['GET', 'POST'])
def home():
    form = LogNavButtons(request.form)
    # When Start is clicked the time is stored to DB after checking if Start has already been clicked
    if request.method == 'POST' and request.form['startTime'] == 'Start':
        # check if any bool is true or false
        if LogNavButtons.startActive == 0:
            # get the time the furncase started logging and set startActive to true(1)
            tm = time.time()
            LogNavButtons.startActive = 1
            flash('Now logging time and labels...', 'success')
            print(tm, LogNavButtons.startActive,
                  LogNavButtons.stopActive, LogNavButtons.pauseActive)
            # disable start button (show/inactive)
            # set Stop and Pause to false (show/active)
            return redirect(url_for('home'))
    # check to see if the Pause button was pressed
    elif request.method == 'POST' and request.form['pauseTime'] == 'Pause':
        if LogNavButtons.pauseActive == 0:
            tm = time.time()
            print(tm, LogNavButtons.startActive,
                  LogNavButtons.stopActive, LogNavButtons.pauseActive)
            LogNavButtons.pauseActive = 1
        return redirect(url_for('home'))
    # check to see if the Stop button has been pressed
    elif request.method == 'POST' and request.form['endTime'] == 'Stop':
        if LogNavButtons.stopActive == 0:
            tm = time.time()
            print(tm, LogNavButtons.startActive,
                  LogNavButtons.stopActive, LogNavButtons.pauseActive)
            LogNavButtons.stopActive = 1
            flash('All logging and counts have stopped...', 'danger')
            print(tm, LogNavButtons.startActive,
                  LogNavButtons.stopActive, LogNavButtons.pauseActive)
        return redirect(url_for('home'))
    # if not, all else
    else:
        return render_template('home.html', title='Furnace Log', form=form)

我没有足够的信誉 link 在带有 markdown 的图像中,但这里是 link 正确加载后的主路线图像。 https://drive.google.com/file/d/1eCC_q_xJjGMObYVI_tJq6UJOePHCYgtj/view?usp=sharing

感谢您的时间、耐心和指导。

堆栈跟踪指明了方向。问题是为什么 'startTime' 不在请求中。答案是按钮不是表单域。如果您单击 'stopTime' 按钮,'startTime' 将不会作为 post 的一部分发送。

前进的一种方法是注意 request.form 是一种 dict,然后更改

if request.method == 'POST' and request.form['startTime'] == 'Start':

if request.method == 'POST' and request.form.get('startTime', '') == 'Start':