Flutter发POST请求表更新成功却返回500及UNIQUE constraint failed错误
问题解决方案
根因分析
你遇到的数据库有更新但前端收到500、报UNIQUE约束失败的现象,核心原因大概率是短时间重复发起了携带相同trip_ID的POST请求:第一次请求插入成功(数据库生成对应记录),第二次请求插入相同主键触发唯一约束报错,前端最终收到的是第二次请求返回的500状态码。此外前后端状态码不匹配、数据库会话未做异常回滚也会放大问题。
具体修复方案
1. 修复重复请求问题
- 在Flutter端的请求触发逻辑(如按钮点击事件)中增加防抖处理,或者设置请求中加载状态,禁止请求未完成前重复调用
postTripDetails方法。 - 在
postTripDetails中打印传入的trip_ID值,同时在Flask接口中打印收到的trip_ID值,确认是否存在重复请求。
2. 优化Flask后端接口逻辑
增加主键预校验、异常捕获、会话回滚和状态码对齐,修改后的接口代码如下:
@app.route('/Trips', methods=['POST']) def add_Trips(): try: trip_ID = request.json['trip_ID'] tripDates = request.json['tripDates'] chosenAttractionsID = request.json['chosenAttractionsID'] # 预校验主键是否已存在,提前拦截重复插入 if Trips.query.filter_by(trip_ID=trip_ID).first(): return {"error": "trip_ID已存在"}, 400 new_trip = Trips(trip_ID, tripDates, chosenAttractionsID) db.session.add(new_trip) db.session.commit() # 返回201状态码和Flutter端的判断逻辑对齐 return trip_schema.jsonify(new_trip), 201 except Exception as e: # 异常时回滚会话,避免后续请求受影响 db.session.rollback() # 打印详细错误日志方便排查 print(f"接口报错:{str(e)}") return {"error": "服务器内部错误"}, 500
3. (推荐)改用数据库自增主键
避免前端生成主键带来的重复风险,修改Trips模型的主键配置,由数据库自动生成主键:
class Trips(db.Model): __tablename__ = 'Trips' # 增加autoincrement=True,不需要前端传trip_ID trip_ID = db.Column(db.Integer, primary_key=True, autoincrement=True) tripDates = db.Column(db.String(100)) chosenAttractionsID = db.Column(db.String(100))
对应修改Flutter的请求body,去掉trip_ID参数即可。
内容的提问来源于stack exchange,提问作者Amit Goft
相关产品推荐
相关产品推荐

