Flask定时更新API调用:避免页面刷新触发的实现方法
解决方案
核心思路是把API调用的结果缓存起来,定时任务负责定期更新这个缓存,页面请求时直接读取缓存内容,不再触发新的API调用。
修改后的代码如下:
from flask_apscheduler import APScheduler from flask import Flask, render_template # 全局变量存储API调用结果,初始化默认值 api_result = "初始数据" def update_api_data(): """定时更新API数据,直接修改全局变量""" global api_result # 这里替换成实际的API调用逻辑 api_result = "API调用返回的最新数据" sched = APScheduler() app = Flask(__name__) @app.route("/home") def home(): # 直接使用缓存的结果,不再调用API return render_template('main_page.html', title='Register', api_data=api_result) if __name__ == "__main__": # 设置24小时执行一次定时任务 sched.add_job( id="daily_api_refresh", func=update_api_data, trigger='interval', hours=24 ) # 启动时先执行一次,避免初始数据为空 update_api_data() sched.start() app.run()
关键改动说明
- 新增全局变量
api_result:专门用来存储API的最新结果,所有请求都从这里取数据。 - 重写定时任务函数
update_api_data:不再返回结果,而是直接更新全局变量里的缓存内容。 - 路由
home不再调用API:直接把缓存的api_result传给模板,页面刷新时不会触发新的API请求。 - 启动时手动执行一次
update_api_data:确保应用刚启动就有最新的API数据,而不是等24小时才第一次更新。
注意事项
如果你的Flask应用是多进程部署(比如用Gunicorn开多个worker),全局变量会因为进程隔离导致每个进程有自己的缓存副本,这时候建议用Redis、Memcached这类独立缓存工具来存储API结果,保证所有进程读取的是同一份数据。
内容的提问来源于stack exchange,提问作者Yazid
相关产品推荐
相关产品推荐

