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

Flask接收POST请求后如何实现页面重新加载?

问题

运行两个独立服务:一个通过WebSocket获取数据并更新SQLite数据库,另一个是Flask应用,从同一SQLite数据库查询数据并在Jinja模板中展示。需求是数据库更新时,Flask应用的页面能自动刷新。

已尝试的方案及问题

方案1:服务端触发重定向

WebSocket服务在数据库提交后,向Flask的/update/1路由发送POST请求,路由内重定向至首页,但页面未刷新。

WebSocket端代码:

cursor.execute("INSERT INTO POST (ID,SOURCE,TITLE,URL) VALUES(?,?,?,?)",(value['_id'], value['source'], value['title'],value['url']))
conn.commit()
requests.post("http://127.0.0.1:5000/update/1")

Flask路由代码:

@app.route("/update/<value>",methods=['GET','POST'])
def update(value):
    if value == '1':
        return redirect("/")
    else:
        return json.dumps({"value":0})

问题:WebSocket服务发起的POST请求属于服务端对服务端的请求,重定向的响应只会返回给WebSocket服务,不会影响用户浏览器中打开的页面。

方案2:返回带刷新脚本的模板

Flask路由直接渲染首页模板并传入参数,Jinja模板中通过location.reload()尝试刷新页面,同样无效。

Flask路由代码:

@app.route("/update/<value>",methods=['GET','POST'])
def update(value):
    if value == '1':
        return render_template("index.html",value=value)
    else:
        return json.dumps({"value":0})

Jinja模板代码:

{% if value == '1' %}    
    <script type="text/javascript">
      location.reload();
    </script>
{% endif %}

问题:服务端返回的带刷新脚本的页面是给WebSocket服务的请求响应,不会加载到用户的浏览器中,因此无法触发刷新。

可行解决方案

方案1:前端定时轮询检查更新

让前端页面定期向Flask后端请求,检查数据库是否有新数据,若有则触发页面刷新。

前端Jinja模板添加代码:

<script>
// 每隔5秒发起一次检查请求
setInterval(() => {
    fetch('/check_update')
        .then(res => res.json())
        .then(data => {
            if (data.need_refresh) {
                location.reload();
            }
        })
        .catch(err => console.error('检查更新失败:', err));
}, 5000);
</script>

Flask添加检查路由:

from flask import jsonify, session

# 需先设置Flask的SECRET_KEY
app.secret_key = 'your_secret_key_here'

@app.route('/check_update')
def check_update():
    # 查询数据库中最新记录的ID
    cursor.execute("SELECT MAX(ID) FROM POST")
    latest_id = cursor.fetchone()[0] or 0
    
    # 对比会话中存储的上次最新ID
    last_known_id = session.get('latest_id', 0)
    need_refresh = latest_id > last_known_id
    
    # 更新会话中的最新ID
    if need_refresh:
        session['latest_id'] = latest_id
    
    return jsonify({'need_refresh': need_refresh})

方案2:WebSocket服务端推送刷新通知

利用已有的WebSocket服务,在数据库更新时直接向前端页面发送刷新指令,这是更高效的方式。

前端Jinja模板添加WebSocket连接代码:

<script>
// 连接到你的WebSocket服务
const ws = new WebSocket('ws://localhost:你的WebSocket服务端口');

ws.onmessage = function(event) {
    // 收到数据库更新的通知时刷新页面
    if (event.data === 'db_updated') {
        location.reload();
    }
};

// 处理连接关闭
ws.onclose = function() {
    console.log('WebSocket连接关闭,尝试重连...');
    setTimeout(() => window.location.reload(), 3000);
};
</script>

WebSocket服务端修改代码:

# 假设使用websockets库,维护所有连接的客户端
connected_clients = set()

async def handle_client(websocket):
    connected_clients.add(websocket)
    try:
        async for _ in websocket:
            pass  # 处理客户端消息(如果需要)
    finally:
        connected_clients.remove(websocket)

# 定义通知所有客户端的函数
async def notify_all_clients():
    if connected_clients:
        message = 'db_updated'
        await asyncio.gather(*[client.send(message) for client in connected_clients])

# 数据库更新提交后调用通知函数
cursor.execute("INSERT INTO POST (ID,SOURCE,TITLE,URL) VALUES(?,?,?,?)",(value['_id'], value['source'], value['title'],value['url']))
conn.commit()
# 触发通知(需确保在异步环境中调用)
await notify_all_clients()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 01:22:11