Flask定时执行函数并本地展示输出的实现及问题求助
解决Flask定时任务重复运行并在浏览器展示结果的问题
我看你遇到的问题是用flask_apscheduler设置的定时任务只跑了一次,而且不知道怎么把任务输出展示在浏览器里。咱们一步步来修复这个问题:
问题分析
你的代码里有几个关键问题:
- 定时任务是在
/trend路由里添加的,每次访问这个路由都会新增一个重复的任务,而且没有在应用启动时初始化APScheduler,导致调度器可能没正常启动。 - 用了
cron触发器的second=5,这表示每分钟的第5秒运行一次,而不是每隔5秒运行。如果想间隔固定时间重复,应该用interval触发器。 - 没有存储定时任务的输出结果,所以没法在浏览器里展示最新的运行结果。
getIntentAndSummary函数多了个self参数,它不是类方法,不需要这个参数。
修复后的完整代码
from flask import Flask, request, jsonify from flask_apscheduler import APScheduler import json app = Flask(__name__) scheduler = APScheduler() # 存储定时任务的最新结果 latest_trend_result = [] def getTrendingEntities(i): global latest_trend_result # 这里替换成你从字典提取文本键的实际业务逻辑 # 以下是模拟示例 sample_dict = {"entity_1": "文本内容A", "entity_2": "文本内容B", "entity_3": "文本内容C"} latest_trend_result = list(sample_dict.keys()) print(f"定时任务已执行,本次结果: {latest_trend_result}") @app.route('/trend', methods=['GET']) def run_tasks(): # 先检查任务是否已存在,避免重复添加 if not scheduler.get_job(id='trend_job'): # 用interval触发器实现每隔5秒运行一次 scheduler.add_job( func=getTrendingEntities, trigger='interval', args=[0], id='trend_job', seconds=5 ) return "定时任务已启动,每隔5秒运行一次" else: return "定时任务已经在运行了" @app.route('/show_trend', methods=['GET']) def show_trend(): # 将最新的定时任务结果返回给浏览器展示 return jsonify({"latest_trending_entities": latest_trend_result}) @app.route('/loc', methods=['POST', 'GET']) def getIntentAndSummary(): # 移除多余的self参数 if request.method == "POST": reqStr = request.data.decode("utf-8", "strict") reqStrArr = reqStr.split() reqStr = ' '.join(reqStrArr) text_1 = [] requestBody = json.loads(reqStr) if requestBody.get('m') is not None: text_1.append(requestBody.get('m')) return jsonify(text_1) # GET请求返回提示信息 return "请发送POST请求,携带包含'm'字段的JSON数据" if __name__ == "__main__": # 初始化并启动APScheduler scheduler.init_app(app) scheduler.start() app.run(port=8000, debug=True)
关键改动说明
- 初始化APScheduler:在应用启动时就完成调度器的初始化和启动,确保定时任务能持续运行。
- 使用interval触发器:
seconds=5实现每隔5秒重复执行任务,完全匹配你的需求。 - 存储任务结果:用全局变量
latest_trend_result保存每次任务的输出,通过/show_trend路由在浏览器实时查看最新结果。 - 避免重复任务:在
/trend路由中检查任务是否已存在,防止多次访问路由创建重复的定时任务。 - 修复函数参数:去掉
getIntentAndSummary中多余的self参数,让函数能正常接收请求。
使用方法
- 启动应用后,访问
http://localhost:8000/trend触发定时任务启动。 - 打开
http://localhost:8000/show_trend,就能看到每隔5秒自动更新的任务输出了。 /loc路由的POST请求功能也能正常使用。
内容的提问来源于stack exchange,提问作者Kedar17
相关产品推荐
相关产品推荐

