Flask/Heroku环境下如何抓取运行中秒表的sec变量或控制台输出?
解决Flask秒表webhook获取实时值的方案
为什么BeautifulSoup拿不到实时值?
BeautifulSoup只能解析静态HTML源码,也就是Flask返回给浏览器的初始页面内容,里面的秒表值是默认的00:00:00,sec变量初始值为0。而秒表的实时更新是前端JS在浏览器内存里完成的,动态修改的DOM和变量值不会体现在静态源码里,所以静态抓取根本拿不到运行中的实时值。
方案一:后端维护秒表状态(最靠谱,生产环境推荐)
把秒表的计时逻辑从前端移到Flask后端,用后端存储状态,这样两个webhook直接操作后端状态即可:
- 核心思路:用后端记录秒表的启动时间戳(或累计时长),启动webhook触发计时开始,获取值的webhook计算当前时长并返回。
- 代码示例(单实例版本):
from flask import Flask, jsonify import time app = Flask(__name__) # 用全局变量存储秒表状态,单实例Heroku应用可用;多实例建议用Redis共享状态 stopwatch_active = False start_timestamp = 0 @app.route('/webhook/start', methods=['POST']) def start_stopwatch(): global stopwatch_active, start_timestamp stopwatch_active = True start_timestamp = time.time() return jsonify({"status": "success", "message": "秒表已启动"}) @app.route('/webhook/get-seconds', methods=['GET']) def get_seconds(): global stopwatch_active, start_timestamp if not stopwatch_active: return jsonify({"sec": 0, "min": 0, "ms": 0}) elapsed_total = time.time() - start_timestamp ms = int(elapsed_total * 1000) % 1000 sec = int(elapsed_total) % 60 min = int(elapsed_total) // 60 return jsonify({ "sec": sec, "min": min, "ms": ms, "formatted": f"{min:02d}:{sec:02d}:{ms:03d}" })
- 多实例适配:如果Heroku用了多个dyno,全局变量无法共享状态,需要用Redis存储启动时间戳和运行状态,安装
redis库后替换全局变量即可。
方案二:用无头浏览器抓取前端动态值(仅测试用,不推荐生产)
如果一定要保留前端计时逻辑,只能用无头浏览器加载页面并执行JS获取sec变量,但这个方案资源消耗大、响应慢,仅适合测试场景:
- 依赖安装:在Heroku上安装Playwright或Selenium,比如Playwright需要添加构建脚本安装浏览器依赖。
- 代码示例:
from flask import Flask, jsonify from playwright.sync_api import sync_playwright app = Flask(__name__) @app.route('/webhook/get-seconds', methods=['GET']) def get_seconds(): with sync_playwright() as p: # 启动无头浏览器 browser = p.chromium.launch(headless=True) page = browser.new_page() # 加载你的Flask秒表页面 page.goto("https://your-heroku-app-url.com/stopwatch") # 执行JS获取当前sec变量值 current_sec = page.evaluate("parseInt(sec)") browser.close() return jsonify({"sec": current_sec})
⚠️ 注意:这个方案中,无头浏览器打开的是新会话,默认秒表未启动,需要确保页面加载时自动启动秒表,或者通过JS触发启动逻辑。
方案三:抓取前端控制台输出?不可行
你提到的抓取控制台输出完全不可行——前端的console.log(sec)是在用户本地浏览器的控制台打印,不会发送到Heroku后端的日志系统,后端根本无法获取这些输出。
内容的提问来源于stack exchange,提问作者MouseWarrior
相关产品推荐
相关产品推荐

