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提交。
修复方案
- 修正前端表单配置,确保所有提交字段的
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>
- 可选后端容错优化:增加字段存在性校验、数值类型转换校验,避免空输入、非法输入触发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
相关产品推荐
相关产品推荐

