Flask执行函数后无法跳转至/tabdata页面的问题求助
Flask页面跳转失败问题解决
问题根源
- 路由函数调用逻辑错误:你直接在
getTableData里调用get_final(df_time),但Flask路由函数是由HTTP请求触发的,直接调用不会触发路由跳转流程;同时get_final作为路由函数,无法通过函数参数接收df_time(路由函数参数仅支持URL路径参数或从请求上下文获取)。 - POST请求响应处理问题:
/api/getTableData是POST接口,若前端通过AJAX发起请求,后端直接返回模板HTML内容时,浏览器不会自动跳转页面,只会在AJAX回调中拿到HTML字符串,不会触发页面刷新。 - 资源泄漏隐患:
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
相关产品推荐
相关产品推荐

