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

如何在Flask中持续从API获取实时数据?

解决Flask中持续获取ThingSpeak实时数据的方案

下面是几个不用重启代码就能自动更新数据的实用方法,适配你的入门场景:

方案1:前端定时请求刷新(最易实现)

直接在前端用JavaScript定时调用Flask接口,获取最新数据后更新表格,后端改动极小:

后端Flask路由(拆分数据逻辑为独立接口)

from flask import Flask, jsonify, render_template
import requests

app = Flask(__name__)

# 封装ThingSpeak数据获取逻辑
def fetch_thingspeak_data():
    # 替换为你的ThingSpeak API地址与参数
    api_url = "https://api.thingspeak.com/channels/XXX/feeds.json?api_key=YYY&results=10"
    resp = requests.get(api_url)
    return resp.json()["feeds"] if resp.status_code == 200 else []

# 主页渲染初始表格
@app.route('/')
def index():
    return render_template('index.html', data=fetch_thingspeak_data())

# 提供实时数据的API接口
@app.route('/api/realtime-data')
def api_realtime_data():
    return jsonify(fetch_thingspeak_data())

if __name__ == '__main__':
    app.run(debug=True)

前端HTML(添加定时刷新逻辑)

在表格页面中加入这段JS,每隔5秒自动拉取并更新数据:

<table id="data-table">
    {% for item in data %}
    <tr>
        <td>{{ item.created_at }}</td>
        <td>{{ item.field1 }}</td>
        <!-- 其他字段按需添加 -->
    </tr>
    {% endfor %}
</table>

<script>
function refreshTable() {
    fetch('/api/realtime-data')
        .then(resp => resp.json())
        .then(newData => {
            const table = document.getElementById('data-table');
            // 清空原有数据行(保留表头)
            while (table.rows.length > 1) table.deleteRow(1);
            // 插入新数据
            newData.forEach(item => {
                const row = table.insertRow();
                row.insertCell().textContent = item.created_at;
                row.insertCell().textContent = item.field1;
            });
        });
}

// 页面加载后立即刷新,之后每5秒执行一次
window.onload = () => {
    refreshTable();
    setInterval(refreshTable, 5000); // 时间间隔可自定义,单位毫秒
};
</script>

方案2:后端定时缓存数据(适合需预处理数据的场景)

如果需要在后端对数据做清洗、计算等预处理,可以用APScheduler在后台定时拉取数据并缓存,前端直接读取缓存结果:

步骤1:安装依赖

pip install apscheduler

步骤2:Flask集成定时任务

from flask import Flask, render_template
from apscheduler.schedulers.background import BackgroundScheduler
import requests

app = Flask(__name__)
# 用全局变量缓存数据(生产环境建议用Redis等专业缓存工具)
cached_data = []

def update_cached_data():
    global cached_data
    api_url = "https://api.thingspeak.com/channels/XXX/feeds.json?api_key=YYY&results=10"
    resp = requests.get(api_url)
    if resp.status_code == 200:
        cached_data = resp.json()["feeds"]

# 初始化定时任务:启动时立即执行一次,之后每5分钟更新一次
scheduler = BackgroundScheduler()
scheduler.add_job(update_cached_data, 'interval', minutes=5, id='thingspeak_sync')
scheduler.start()

@app.route('/')
def index():
    return render_template('index.html', data=cached_data)

# 关闭应用时停止定时任务
@app.teardown_appcontext
def shutdown_scheduler(exception=None):
    scheduler.shutdown()

if __name__ == '__main__':
    app.run(debug=True)

方案3:Server-Sent Events(SSE,实时推送)

如果需要数据更新时立即推送给前端,无需前端轮询,可以用SSE实现单向实时推送:

后端Flask路由

from flask import Flask, render_template, Response
import requests
import time

app = Flask(__name__)

def data_stream():
    while True:
        # 拉取最新一条数据
        api_url = "https://api.thingspeak.com/channels/XXX/feeds.json?api_key=YYY&results=1"
        resp = requests.get(api_url)
        if resp.status_code == 200:
            latest_item = resp.json()["feeds"][0]
            # 按SSE格式返回数据
            yield f"data: {latest_item}\n\n"
        time.sleep(3) # 每3秒检查一次更新

@app.route('/')
def index():
    return render_template('sse_index.html')

@app.route('/stream')
def stream():
    return Response(data_stream(), mimetype='text/event-stream')

前端HTML

<table id="data-table">
    <tr>
        <th>时间</th>
        <th>字段1</th>
    </tr>
</table>

<script>
const eventSource = new EventSource('/stream');
const table = document.getElementById('data-table');

eventSource.onmessage = function(event) {
    const latestItem = JSON.parse(event.data);
    // 将新数据插入表格顶部
    const row = table.insertRow(1);
    row.insertCell().textContent = latestItem.created_at;
    row.insertCell().textContent = latestItem.field1;
};
</script>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:12:27