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

Flask后端+Vanilla JS前端:POST请求无法跳转至HTML页面求助

问题描述

我需要将前端下拉框的值传递到后端,根据该值完成计算后,由对应端点返回HTML页面,不需要POST方法返回JSON响应(如return jsonify)。当前使用Flask作为后端、原生JS作为前端。

目前已成功通过POST方法将下拉框值传递到后端,服务器与浏览器控制台均无报错,但点击提交按钮后目标HTML页面没有被渲染出来。


前端代码

HTML文件(index.html)

<label for="mode">Select Mode:</label>
<select id="mode" name="mode">
    <option value="autoencoder">Autoencoder</option>
    <option value="decoder">Decoder</option>
</select>
<button id="Module_submitBtn">Chose Module</button>

<script src="static/js/call_module.js "></script>

JS文件(call_module.js)

function submitMode() {
    var selectedMode = document.getElementById("mode").value;

    fetch('/update_mode', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({ mode: selectedMode })
    })
        .catch(error => console.error('Error:', error));
}

const submitBtn = document.getElementById('Module_submitBtn');
submitBtn.addEventListener('click', submitMode);

后端代码

Python文件

# 用于渲染HTML文件的目标端点
@app.route("/decoder_graphical_view", methods=['GET'])
def decoder_graphical_view(name=None):
    config_val = Decoder_Config.config_val
    return render_template("decoder_graph.html",
                           N_value=config_val["Decoder_live_plot"]["N_"],
                           ebno_value=config_val["Decoder_live_plot"]["ebno_"],
                           phi_value=config_val["Decoder_live_plot"]["phi_"],
                           learningRate_value=config_val["Decoder_live_plot"]["learning_rate_"],
                           name=name
                           )

# 处理POST请求的端点,接收下拉框值并调用decoder_graphical_view函数
@app.route('/update_mode', methods=['POST'])
def update_mode(name=None):
    selected_mode = request.json.get('mode')

    if selected_mode == 'autoencoder':
        return redirect(url_for('decoder_graphical_view'))
    elif selected_mode == 'decoder':
        return redirect(url_for('decoder_graphical_view'))

我还尝试过以下update_mode写法,结果一致:

@app.route('/update_mode', methods=['POST'])
def update_mode(name=None):
    selected_mode = request.json.get('mode')
    # 设置配置数据的默认值
    Decoder_Config.config_val["Decoder_live_plot"]["N_"]     = 100
    Decoder_Config.config_val["Decoder_live_plot"]["ebno_"]  = 2.0
    Decoder_Config.config_val["Decoder_live_plot"]["phi_"]   = 5
    Decoder_Config.config_val["Decoder_live_plot"]["train_"] = "True"
    train_var = str(Decoder_Config.config_val["Decoder_live_plot"]["train_"]).lower()
    if train_var == "true":
        train_var = True
    else:
        train_var = False
    Decoder_Config.config_val["Decoder_live_plot"]["learning_rate_"]   = 0.005

    if selected_mode == 'autoencoder':
        print("selected_mode: ", selected_mode)
        return render_template("decoder_graph.html",
                                N_value=config_val["Decoder_live_plot"]["N_"],
                                ebno_value=config_val["Decoder_live_plot"]["ebno_"],
                                phi_value=config_val["Decoder_live_plot"]["phi_"],
                                learningRate_value=config_val["Decoder_live_plot"]["learning_rate_"],
                                name=name
                                )

    elif selected_mode == 'decoder':
        return render_template("decoder_graph.html",
                                N_value=config_val["Decoder_live_plot"]["N_"],
                                ebno_value=config_val["Decoder_live_plot"]["ebno_"],
                                phi_value=config_val["Decoder_live_plot"]["phi_"],
                                learningRate_value=config_val["Decoder_live_plot"]["learning_rate_"],
                                name=name
                                )

已尝试的方案

尝试过多种Flask重定向相关的方案,但均未解决问题。

点击提交按钮时,服务器控制台日志如下:

"POST /update_mode HTTP/1.1" 302 -
"GET /decoder_graphical_view HTTP/1.1" 200

解决方案

问题核心是fetch API不会自动处理重定向跳转:服务器返回302后,fetch会自动跟随请求获取目标页面内容,但不会更新浏览器URL或渲染页面。有两种解决方法:

方法一:修改fetch响应处理逻辑

在fetch的.then中手动处理重定向跳转:

function submitMode() {
    var selectedMode = document.getElementById("mode").value;

    fetch('/update_mode', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({ mode: selectedMode })
    })
    .then(response => {
        // 检测到重定向时手动跳转
        if (response.redirected) {
            window.location.href = response.url;
        }
    })
    .catch(error => console.error('Error:', error));
}

方法二:改用原生表单提交(无需fetch)

如果不需要异步处理,直接用HTML表单提交更简单,无需JS:

<form action="/update_mode" method="POST">
    <label for="mode">Select Mode:</label>
    <select id="mode" name="mode">
        <option value="autoencoder">Autoencoder</option>
        <option value="decoder">Decoder</option>
    </select>
    <button type="submit">Chose Module</button>
</form>

同时修改后端接收参数的方式(表单提交的是form-data,而非JSON):

@app.route('/update_mode', methods=['POST'])
def update_mode(name=None):
    # 改用form.get获取参数
    selected_mode = request.form.get('mode')
    
    # 后续逻辑保持不变
    if selected_mode == 'autoencoder':
        return redirect(url_for('decoder_graphical_view'))
    elif selected_mode == 'decoder':
        return redirect(url_for('decoder_graphical_view'))

内容的提问来源于stack exchange,提问作者karim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 14:04:57