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

Flask写入数据到MSSQL报400 Bad Request错误排查

问题根因

返回400 Bad Request和数据库操作无关,是Flask表单取值逻辑触发的内置错误:当代码直接通过request.form["键名"]取值、但提交的请求体中不存在对应键时,Flask会直接返回400响应,不会执行后续的数据库连接、写入逻辑。
你的代码共有3处直接触发该错误的配置问题:

  • DID、Ccode两个输入框未设置name属性:HTML表单提交时只会携带配置了name属性的字段值,你给这两个输入框写的DID="DID"、Ccode="Ccode"是无效自定义属性,请求体中不会包含这两个字段,后端取值时直接触发键不存在错误。
  • 状态字段名大小写不匹配:后端取值使用的键是全大写STATUS,但前端对应输入框的name属性值为Status,二者大小写不一致,后端无法匹配到对应字段。
  • 提交按钮type属性配置错误:按钮写的是type="btnAdd",只有设置type="submit"的按钮才能正常触发表单POST提交。
修复方案
  1. 修正前端表单配置,确保所有提交字段的name属性值和后端取值的键名完全一致,修正提交按钮type属性,修正后的表单代码如下:
<body>
<h2>Chart Details</h2>

<form action="" method = "POST">
    <div class="form-group row">
      <label for="DID">Enter DID</label>
      <input type="NUMBER" class="form-control" name="DID" id="DID">
    </div>
    <div class="form-group row">
        <label for="Ccode">ENTER Ccode</label>
        <input type="NUMBER" class="form-control" name="Ccode" id="Ccode">
    </div>
    <div class="form-group row">
        <label for="TOA">TypeOfAccount</label>
        <input type="text" class="form-control" name="TOA" id="TOA">
    </div>
    <div class="form-group row">
        <label for="Debit">Enter Debit Amount</label>
        <input type="NUMBER" class="form-control" name="Debit" id="Debit">
    </div>
    <div class="form-group row">
        <label for="Credit">Enter Credit Amount</label>
        <input type="NUMBER" class="form-control" name="Credit" id="Credit">
    </div>
    <div class="form-group row">
        <label for="isLocked">isLocked</label>
        <input type="text" class="form-control" name="isLocked" id="isLocked">
    </div>
    <div class="form-group row">
        <label for="STATUS">Account Status</label>
        <input type="text" class="form-control" name="STATUS" id="STATUS">
    </div>
    <button type="submit" class="btn btn-primary">Submit</button>
    <a href="/" class="btn btn-primary">Cancel</a>
  </form>
  1. 可选后端容错优化:增加字段存在性校验、数值类型转换校验,避免空输入、非法输入触发500错误,参考代码如下:
@project1.route("/addrecord", methods = ['GET','POST'])
def addcar():
    if request.method == 'GET':
        return render_template("addrecord.html")
    if request.method == 'POST':
        # 校验必填字段是否存在
        required_fields = ["DID", "Ccode", "TOA", "Debit", "Credit", "isLocked", "STATUS"]
        for field in required_fields:
            if field not in request.form:
                return f"缺失必填字段:{field}", 400
        # 校验数值类型字段格式
        try:
            DID = int(request.form["DID"])
            Ccode = int(request.form["Ccode"])
            TOA = request.form["TOA"]
            Debit = int(request.form["Debit"])
            Credit = int(request.form["Credit"])
            isLocked = request.form["isLocked"]
            STATUS = request.form['STATUS']
        except ValueError:
            return "DID、Ccode、Debit、Credit字段必须输入合法整数", 400
        # 执行数据库写入
        conn = connection()
        cursor = conn.cursor()
        cursor.execute("INSERT INTO dbo.tbl_Chart_Detail (DID, Ccode, TOA, Debit, Credit, isLocked, STATUS) VALUES (?, ?, ?, ?, ?, ?, ?)", DID, Ccode, TOA, Debit, Credit, isLocked, STATUS)
        conn.commit()
        conn.close()
        return redirect('/')

内容的提问来源于stack exchange,提问作者Zain Shahzad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 01:57:23