Flask路由终端显示正常但页面未跳转至带参classification.html求助
问题描述
终端日志显示POST /classification/请求返回302、GET /hasil/True-NORMAL2-IM-0421-0001.jpeg请求返回200,但页面未跳转到带参数的classification.html。相关代码如下:
dropzone = Dropzone(app) @app.route('/classification/', methods=['POST','GET']) def classification(): p = False if request.method == 'POST': f = request.files.get('file') f.save(os.path.join(app.config['UPLOADED_PATH'],f.filename)) model = load_model('static/model/TA_resnet50 epoch50 imgsize200.h5') model.make_predict_function() img_path = "static/upload_images/"+f.filename p = predict_label(img_path, model) cursor.execute('INSERT INTO riwayat (userid, tanggal, hasil_klasifikasi, kode_citra) VALUES (%s, %s, %s, %s)', (session.get('userid'), '11/12/2014', p, f.filename)) cnx.commit() img_name = f.filename p = True if p: print("Reached redirect") return redirect(url_for('hasil', p_val=p, img_name_val=img_name, _external=True )) return render_template("classification.html") @app.route('/hasil/<p_val>-<img_name_val>', methods=['GET']) def hasil(p_val, img_name_val): return render_template("classification.html", predict=p_val, img_name=img_name_val)
预期触发hasil路由后页面加载带参数的classification.html,但实际未实现,请问哪里出现问题?
问题排查与解决
1. 变量覆盖导致预测值丢失
你在POST请求处理流程中,先用p存储predict_label的分类结果,之后又执行p = True覆盖了原本的预测值。这会导致:
url_for传递给hasil路由的p_val是布尔值True,而非实际的分类标签- 最终渲染页面时,
predict参数也只是True,无法展示正确的分类结果
2. 路由参数解析存在隐患
hasil路由使用/hasil/<p_val>-<img_name_val>格式,如果图片名称包含-(比如示例中的NORMAL2-IM-0421-0001.jpeg),会导致路由错误拆分参数,无法正确获取完整的img_name_val。
3. 异步上传的跳转限制
如果使用Dropzone的异步上传功能,后端返回的302重定向不会自动触发页面跳转——因为AJAX请求默认不会跟随重定向,需要前端手动处理。
修复步骤
(1)修复变量覆盖问题
拆分存储预测结果和跳转标记的变量,避免值被覆盖:
@app.route('/classification/', methods=['POST','GET']) def classification(): should_redirect = False predict_result = None img_name = None if request.method == 'POST': f = request.files.get('file') f.save(os.path.join(app.config['UPLOADED_PATH'],f.filename)) model = load_model('static/model/TA_resnet50 epoch50 imgsize200.h5') model.make_predict_function() img_path = "static/upload_images/"+f.filename predict_result = predict_label(img_path, model) cursor.execute('INSERT INTO riwayat (userid, tanggal, hasil_klasifikasi, kode_citra) VALUES (%s, %s, %s, %s)', (session.get('userid'), '11/12/2014', predict_result, f.filename)) cnx.commit() img_name = f.filename should_redirect = True if should_redirect: print("Reached redirect") return redirect(url_for('hasil', p_val=predict_result, img_name_val=img_name)) return render_template("classification.html")
(2)优化路由参数格式
推荐两种更稳定的路由方案:
- 方案1:使用查询字符串
@app.route('/hasil', methods=['GET']) def hasil(): p_val = request.args.get('p_val') img_name_val = request.args.get('img_name_val') return render_template("classification.html", predict=p_val, img_name=img_name_val)
此时重定向代码无需修改,url_for会自动生成带查询参数的URL。
- 方案2:使用斜杠分隔参数
@app.route('/hasil/<p_val>/<img_name_val>', methods=['GET']) def hasil(p_val, img_name_val): return render_template("classification.html", predict=p_val, img_name=img_name_val)
(3)处理异步上传的跳转逻辑
在前端Dropzone配置中添加成功回调,手动触发页面跳转:
Dropzone.options.myDropzone = { success: function(file, response) { window.location.href = response; } };
内容的提问来源于stack exchange,提问作者phpers
相关产品推荐
相关产品推荐

