Flask+SQLAlchemy接口优化:外部POST请求需返回错误码与消息
解决方案
要同时满足网页端的flash提示+跳转需求,以及外部客户端的状态码+消息返回需求,核心是区分请求类型(网页表单/API JSON),分别处理响应逻辑:
- 对于网页表单提交:保持原有的flash提示和首页跳转逻辑
- 对于JSON格式的API请求:根据记录是否存在返回对应状态码和JSON消息,让客户端自行处理跳转
修改后的代码如下:
# 创建模型 class Product(db.Model): id = db.Column(db.String(100), primary_key=True) total = db.Column(db.Integer()) # 首页路由 @app.route('/') def home(): product = Product.query.all() return render_template('index.html', products=product) # 添加记录路由 @app.route('/add', methods=['POST']) def add(): # 解析请求数据并标记请求类型 if request.is_json: data = request.get_json() is_api_request = True else: data = request.form is_api_request = False product_id = data['product_id'] product_quantity = data['product_quantity'] product_exist = Product.query.filter_by(id=product_id).first() if product_exist: if is_api_request: # API请求:返回409冲突状态码+错误消息 return {"message": f"{product_id} already in list"}, 409 else: # 网页请求:flash错误消息并跳转首页 flash(f"{product_id} already in list", category="error") return redirect(url_for('home')) else: # 记录不存在,执行入库操作 new_product = Product(id=product_id, total=product_quantity) db.session.add(new_product) db.session.commit() if is_api_request: # API请求:返回201创建成功状态码+成功消息 return {"message": f"{product_quantity} {product_id} added successfully."}, 201 else: # 网页请求:flash成功消息并跳转首页 flash(f"{product_quantity} {product_id} added successfully.", category="success") return redirect(url_for('home'))
关键修改说明:
- 请求类型区分:通过
request.is_json判断是否为API类JSON请求,拆分响应逻辑 - HTTP状态码规范:
- 记录已存在时,API返回
409 Conflict(符合HTTP语义:请求与当前服务器状态冲突) - 记录新增成功时,API返回
201 Created(明确标识资源已成功创建)
- 记录已存在时,API返回
- 代码优化:提前提取
product_id和product_quantity,避免创建无用的Product实例 - 双端兼容:网页端原有功能完全保留,外部客户端可根据返回的状态码和消息自行处理跳转逻辑
内容的提问来源于stack exchange,提问作者xXJohnRamboXx
相关产品推荐
相关产品推荐

