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

Flask校车监控应用busdata API更新延迟问题求助

校车监控Flask应用数据同步延迟问题修复

问题描述

开发的Flask校车监控应用中,管理员通过/admin页面提交校车到校状态后,/busdata接口返回的数据无法立即同步更新,前端依赖该接口导致显示滞后。

核心问题分析

  1. 浏览器GET请求缓存:/busdata接口使用GET方法,浏览器默认会缓存此类请求的响应,导致前端重复获取到旧数据。
  2. Flask多线程环境下的全局变量同步:默认Flask开发服务器为多线程模式,全局变量busdata的修改可能存在线程间同步延迟,极端场景下会出现数据不一致。

修复方案及代码调整

1. 禁用/busdata接口的浏览器缓存

在/busdata接口的响应中添加缓存控制头,强制浏览器每次请求都从服务器拉取最新数据:

@app.route("/busdata", methods=["GET"])
def transfer_data():
    global busdata
    response = jsonify(busdata)
    # 添加缓存控制头,禁止浏览器缓存
    response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
    response.headers["Pragma"] = "no-cache"
    response.headers["Expires"] = "0"
    return response

2. 优化全局变量的线程安全性(推荐)

使用threading.Lock确保busdata的读写操作原子性,避免多线程下的竞态条件:

from flask import Flask, jsonify, request, render_template
import threading

app = Flask(__name__)

original_busdata = {
    "present": [],
    "absent": [i for i in range(1, 32)]  # 初始状态所有校车未到校
}

busdata = original_busdata
# 初始化锁对象,保证数据操作的线程安全
busdata_lock = threading.Lock()

@app.route("/busdata", methods=["GET"])
def transfer_data():
    global busdata
    with busdata_lock:
        response = jsonify(busdata)
        response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
        response.headers["Pragma"] = "no-cache"
        response.headers["Expires"] = "0"
        return response

@app.route("/admin", methods=["GET", "POST"])
def template():
    global busdata
    present = []
    absent = []
    if request.method == "POST":
        for i in range(1, 32):
            if f"bus-{i}" in request.form:
                present.append(i)
            else:
                absent.append(i)
        # 修改数据时加锁,确保原子性
        with busdata_lock:
            busdata["present"] = present
            busdata["absent"] = absent
    # 读取数据时加锁,保证一致性
    with busdata_lock:
        checkbox_data = {}
        for bus in busdata["present"]:
            checkbox_data[bus] = True
        for bus in busdata["absent"]:
            checkbox_data[bus] = False
        checkbox_data = dict(sorted(checkbox_data.items()))
        return render_template("admin.html", busdata=busdata, checkbox_data=checkbox_data)

if __name__ == "__main__":
    app.run()

3. 修复模板中的标签绑定错误

admin.html模板中标签的for属性使用了未定义变量i,需修正为bus:

<!-- 原错误代码 -->
<label for="bus-{{ i }}">Bus {{ bus }}</label>

<!-- 修改后代码 -->
<label for="bus-{{ bus }}">Bus {{ bus }}</label>

额外优化建议

  • 生产环境部署时,建议使用Redis、数据库等持久化存储替代全局变量,避免服务器重启或多实例部署导致的数据丢失。
  • 可将管理员页面的表单提交改为AJAX异步请求,无需刷新页面即可完成状态更新,提升交互体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 06:35:01