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

Python+Flet Web模式下如何实现浏览器页面彻底刷新重启应用

问题描述

代码示例

import os
import flet as ft

async def main(page: ft.Page):
    list_files = os.listdir("some_files")
    print(list_files) #for test

    page.add(ft.Text(list_files))
    page.update()

ft.app(target=main, view=None, port=44051)

操作与问题

  • 运行上述代码,Chrome浏览器显示文件列表:['test1.txt', 'test2.txt', 'test3.txt', 'test4.txt', 'test5.txt']
  • 删除some_files目录下任意文件后刷新浏览器,出现两个问题:
    1. 文件列表未更新
    2. 控制台报错:self._sock.shutdown(socket.SHUT_RDWR) ConnectionResetError: [WinError 10054]
  • 新开标签页打开应用,文件列表能正常更新为当前状态

需求:实现浏览器页面刷新时,让应用重新加载数据(或重启应用)以完成真正的更新。


解决方案

思路1:监听页面连接状态,刷新时重新获取数据

利用Flet内置的页面连接事件,在浏览器刷新触发的重新连接动作中,重新加载文件列表并更新页面,这是更高效的方案,同时可以规避连接重置报错:

import os
import flet as ft

async def load_and_display_files(page: ft.Page):
    # 清空现有内容,重新获取并展示文件列表
    page.controls.clear()
    list_files = os.listdir("some_files")
    print(list_files)
    page.add(ft.Text(list_files))
    await page.update_async()

async def main(page: ft.Page):
    # 首次加载文件
    await load_and_display_files(page)

    # 监听页面重新连接事件(浏览器刷新会触发)
    async def on_page_resume(e):
        await load_and_display_files(page)
    
    page.on_resume = on_page_resume

    # 空处理连接断开事件,避免WinError 10054报错
    async def on_page_disconnect(e):
        pass
    
    page.on_disconnect = on_page_disconnect

ft.app(target=main, view=None, port=44051)

思路2:强制刷新时重启应用进程(仅作参考,不推荐)

如果必须重启整个应用,可以通过检测连接断开事件,启动新进程并终止当前进程。这种方式会导致服务短暂中断,仅适用于特殊场景:

import os
import sys
import flet as ft
from multiprocessing import Process

def run_app():
    async def main(page: ft.Page):
        list_files = os.listdir("some_files")
        print(list_files)
        page.add(ft.Text(list_files))
        await page.update_async()

        # 监听页面断开连接事件,触发重启
        async def on_disconnect(e):
            # 启动新应用进程
            new_process = Process(target=run_app)
            new_process.start()
            # 终止当前进程
            sys.exit()
        
        page.on_disconnect = on_disconnect

    ft.app(target=main, view=None, port=44051)

if __name__ == "__main__":
    run_app()

说明

  • 思路1是优先方案:通过on_resume事件实现数据实时刷新,同时用空的on_disconnect处理避免了连接重置报错,逻辑轻量且高效。
  • 思路2仅用于必须重启应用的场景,进程重启会导致服务短暂不可用,日常开发不建议使用。

内容的提问来源于stack exchange,提问作者Сергей Попков

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 00:21:12