Werkzeug BadRequestKeyError求助:表单提交无法获取id字段值
解决 Werkzeug BadRequestKeyError: 'id' 问题
嘿,这个问题其实挺常见的——你的表单提交时根本没把id字段的值传给服务器!让我一步步帮你搞定:
问题根源:表单输入框缺少name属性
看你的HTML代码,id输入框写的是:
<input type="number" placeholder="id" Id="id" />
浏览器提交表单的时候,只会识别带有name属性的输入控件,你这里用的Id="id"(还是大写的I)只是元素的DOM标识,和表单提交的参数完全无关。服务器端拿不到id这个请求参数,自然就抛出了BadRequestKeyError。
修复步骤
1. 修改HTML表单的id输入框
把Id="id"改成name="id",如果需要前端DOM操作的话,可以同时保留小写的id="id":
<p><input type="number" placeholder="id" id="id" name="id" /></p>
2. 合并冲突的Flask路由
你现在定义了两个@app.route("/")的视图函数,Flask只会加载最后一个(也就是post()),这很不规范。建议合并成一个同时处理GET和POST请求的函数:
from flask import Flask, render_template, request import sqlite3 app = Flask(__name__) @app.route("/", methods=["GET", "POST"]) def home(): if request.method == "POST": # 用get方法更安全,避免参数缺失时抛出KeyError,还能设置默认值 user = request.form.get('nm', '') id = request.form.get('id', '') if user and id: # 简单校验输入不为空 # 假设你已经建立了数据库连接 conn = sqlite3.connect('your_database.db') cur = conn.cursor() sql = '''INSERT INTO abc (id, name) VALUES (?, ?) ''' val = (id, user) cur.execute(sql, val) conn.commit() # 务必提交事务!不然数据不会真正写入数据库 conn.close() return 'Ok' return '请填写完整的id和名称' # GET请求时返回登录页面 return render_template("login.html")
3. 关于request.form.get('id')返回None的说明
之前你用get方法返回的"null"其实是Python里的None,原因就是表单根本没传id这个参数过来。现在修复name属性后,就能正常获取到输入的值了。用get方法比直接取request.form['id']更稳妥,参数不存在时不会报错,而是返回你指定的默认值。
内容的提问来源于stack exchange,提问作者 younus
相关产品推荐
相关产品推荐

