You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 01:05:53