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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 03:49:56