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

Flask执行函数后无法跳转至/tabdata页面的问题求助

Flask页面跳转失败问题解决

问题根源

  1. 路由函数调用逻辑错误:你直接在getTableData里调用get_final(df_time),但Flask路由函数是由HTTP请求触发的,直接调用不会触发路由跳转流程;同时get_final作为路由函数,无法通过函数参数接收df_time(路由函数参数仅支持URL路径参数或从请求上下文获取)。
  2. POST请求响应处理问题:/api/getTableData是POST接口,若前端通过AJAX发起请求,后端直接返回模板HTML内容时,浏览器不会自动跳转页面,只会在AJAX回调中拿到HTML字符串,不会触发页面刷新。
  3. 资源泄漏隐患:get_table中启动的Chrome Driver未关闭,会导致大量残留进程占用系统资源。

修复方案

方案1:表单提交场景(非AJAX)

通过Session存储DataFrame,处理POST请求后重定向到/tabdata路由:

from flask import Flask, request, render_template, redirect, url_for, session
import pickle
import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By

app = Flask(__name__)
# 必须配置SECRET_KEY才能使用Session,建议用随机生成的安全密钥
app.secret_key = "your_secure_secret_key_here"

@app.route('/api/getTableData', methods=['POST'])
def getTableData():
    # 表单提交用request.form,AJAX请求用request.json
    value = request.form.get('value', '')
    value = value[:8]
    url = "https://some.com" + value
    df_time = get_table(url)
    
    # 将DataFrame序列化后存入Session(Session仅支持可序列化数据)
    session['df_time'] = pickle.dumps(df_time).hex()
    
    # 重定向到/tabdata路由
    return redirect(url_for('get_final'))

def get_table(url):
    options = webdriver.ChromeOptions()
    # 建议添加无头模式,避免弹出浏览器窗口
    options.add_argument('--headless=new')
    driver = webdriver.Chrome(options=options) 
    try:
        driver.get(url) 
        abv = pd.read_html(driver.find_element(By.ID,"frm_hist").get_attribute('outerHTML'))[0]
        df_time = pd.DataFrame(abv)  
    finally:
        # 确保浏览器进程被关闭,避免资源泄漏
        driver.quit()
    return df_time

@app.route("/tabdata")  
def get_final():
    # 从Session中取出并反序列化DataFrame
    df_hex = session.pop('df_time', None)
    if not df_hex:
        # 无数据时重定向到首页或错误页
        return redirect(url_for('index'))
    
    df_time = pickle.loads(bytes.fromhex(df_hex))
    return render_template("new.html", df_time=df_time)

# 示例首页路由
@app.route('/')
def index():
    return render_template('index.html')

方案2:AJAX请求场景

后端返回跳转URL,前端通过JS完成页面跳转:

后端代码

@app.route('/api/getTableData', methods=['POST'])
def getTableData():
    value = request.json.get('value', '')
    value = value[:8]
    url = "https://some.com" + value
    df_time = get_table(url)
    
    session['df_time'] = pickle.dumps(df_time).hex()
    # 返回跳转地址
    return {"redirect_url": url_for('get_final')}

# get_table和get_final函数同方案1

前端JS示例(jQuery)

// 假设点击按钮触发请求
$("#submit-btn").click(function() {
    var value = $("#input-value").val();
    $.ajax({
        url: '/api/getTableData',
        type: 'POST',
        contentType: 'application/json',
        data: JSON.stringify({value: value}),
        success: function(res) {
            // 跳转到指定页面
            window.location.href = res.redirect_url;
        },
        error: function(err) {
            console.error('请求失败:', err);
        }
    });
});

关键注意事项

  • 必须配置SECRET_KEY才能使用Flask Session,建议使用随机生成的高安全密钥。
  • 使用pickle序列化DataFrame时,要避免存入不可信数据,防止安全风险。
  • 务必在get_table中关闭Chrome Driver,防止进程泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 18:15:41