使用Flask与Firebase时点击按钮触发POST请求出现400 Bad Request错误求助
解决Flask + Firebase POST请求400 Bad Request问题
你的问题核心在于:点击按钮2(检索数据)时,后端代码默认先去获取il、yas等表单字段,但此时你的请求里并没有这些数据——毕竟按钮2的功能是查询,不是提交新数据,这就触发了Flask的KeyError,最终返回400错误。
问题拆解
你当前的代码逻辑是,只要是POST请求,就先去获取所有添加数据需要的字段,再判断按钮类型。但按钮2的请求里根本没有这些字段,自然会报错。而且如果按钮的name不是submit,或者值不是add,那查询逻辑也不会执行,反而直接跳转到默认渲染,还伴随字段缺失的错误。
修复方案
我们需要先判断用户点击的是哪个按钮,再执行对应的逻辑,避免在查询操作里去获取不必要的字段:
修改后端视图函数
@app.route('/satis', methods=['GET', 'POST']) def satis(): db = firebase.database() # 先获取所有数据用于初始渲染,处理数据库为空的情况 todo = db.child("names").get() to = todo.val() if todo.val() else {} if request.method == 'POST': # 判断点击的是添加按钮还是查询按钮 if 'add_record' in request.form: # 仅在添加操作时获取所需字段,加上异常处理防止字段缺失 try: sehir = request.form['il'] yas = request.form['yas'] record_id = request.form['id'] # 避免和Python内置的id关键字冲突 gun = request.form['satisgunu'] cins = request.form['cinsiyet'] tarz = request.form['satistarzi'] # 写入Firebase数据库 db.child("names").push({ "sehir": sehir, "yas": yas, "id": record_id, "gun": gun, "cins": cins, "tarz": tarz }) # 重新获取最新数据 todo = db.child("names").get() to = todo.val() if todo.val() else {} except KeyError as e: # 返回友好的字段缺失提示,而不是直接返回400错误 return render_template('satis.html', t=to.values(), error=f"缺少必填字段: {str(e)}") elif 'query_record' in request.form: # 处理查询操作,这里固定查询id为2的记录,也可以改成动态接收参数 users_by_score = db.child("names").order_by_child("id").equal_to("2").get() us = users_by_score.val() if users_by_score.val() else {} return render_template('satis.html', t=to.values(), u=us.values()) # GET请求或POST处理完成后默认返回页面 return render_template('satis.html', t=to.values())
对应修改前端表单
确保两个按钮的name和后端判断的一致,建议将添加和查询操作分开(或者同一个表单里的两个按钮,只要name正确即可):
<!-- 添加数据的表单 --> <form method="POST"> <input type="text" name="il" placeholder="Şehir" required> <input type="text" name="yas" placeholder="Yaş" required> <input type="text" name="id" placeholder="ID" required> <input type="text" name="satisgunu" placeholder="Satış Günü" required> <input type="text" name="cinsiyet" placeholder="Cinsiyet" required> <input type="text" name="satistarzi" placeholder="Satış Tarzı" required> <button type="submit" name="add_record" value="1">按钮1(添加数据)</button> </form> <!-- 查询数据的表单 --> <form method="POST"> <button type="submit" name="query_record" value="1">按钮2(检索ID为2的记录)</button> </form>
额外提示
- 避免使用Python内置关键字
id作为变量名,我改成了record_id,防止潜在冲突。 - 添加
if todo.val() else {}的判断,避免当数据库为空时to.values()报错。 - 给前端输入框加上
required属性,可以在客户端先做校验,减少后端异常。
内容的提问来源于stack exchange,提问作者Hemen Al Denizli
相关产品推荐
相关产品推荐

