BadRequestKeyError排查:前端输入框传值至后端数据库查询
解决Werkzeug BadRequestKeyError: 'nume_pacient'问题
问题根源
- 表单提交逻辑错误:HTML中点击
<a href="/pacienti/cautare">会直接发起GET请求跳转,完全绕过表单提交流程,输入框的nume_pacient数据根本没被发送到后端。 - 后端请求处理逻辑颠倒:当前后端在GET请求中尝试读取
request.form,但表单数据仅在POST请求时才会被包含在request.form中;且GET请求不适合携带表单数据。 - SQL语句存在注入风险:用字符串格式化拼接SQL参数,不仅可能引发SQL注入攻击,还存在语法错误(
{{x}}是Jinja语法,Python的format无需双大括号)。
修复方案
1. 修改HTML表单提交逻辑
将表单内的按钮改为表单提交按钮,移除<a>标签,确保点击按钮时提交表单并发送数据:
<form method="POST" action="/pacienti/cautare"> <input type="text" name="nume_pacient"> <button type="submit">Cautare Pacient</button> </form>
- 新增
action="/pacienti/cautare"指定表单提交目标地址 - 将按钮改为
type="submit",移除<a>标签,确保触发表单提交流程
2. 修正后端请求处理逻辑
调整为处理POST请求,安全获取参数,使用参数化查询执行SQL:
@auth.route('/pacienti/cautare', methods=["GET", "POST"]) def cautarePacient(): if request.method == 'POST': # 安全获取参数,避免KeyError numeCautare = request.form.get('nume_pacient') if not numeCautare: # 处理参数为空的情况 return render_template("home.html", user=current_user, rows=[]) connection = sqlite3.connect('database.db') cursor = connection.cursor() # 使用参数化查询,防止SQL注入 cursor.execute("SELECT * FROM pacient WHERE nume = ?", (numeCautare,)) rows = cursor.fetchall() connection.close() # 查询操作无需commit,直接关闭连接 return render_template("home.html", user=current_user, rows=rows) # GET请求时返回空结果或引导用户使用表单 return render_template("home.html", user=current_user, rows=[])
- 切换到处理POST请求,符合表单提交的规范
- 使用
request.form.get()获取参数,避免参数不存在时抛出KeyError - 使用SQLite参数化查询(
?占位符),彻底规避SQL注入风险 - 查询操作无需
connection.commit(),直接关闭连接即可
内容的提问来源于stack exchange,提问作者sergiutzuu
相关产品推荐
相关产品推荐

