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目录下任意文件后刷新浏览器,出现两个问题:- 文件列表未更新
- 控制台报错:
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,提问作者Сергей Попков
相关产品推荐
相关产品推荐

