解决Flet异步应用中client_storage的NotImplementedError问题
解决方案:Flet + Telethon 异步应用账号加载错误与自动加载实现
一、解决NotImplementedError问题
这个错误通常由以下两种原因导致:
1. 误用同步/异步存储方法
Flet的client_storage提供同步、异步两套API,在异步函数中调用同步方法(如get())会触发线程兼容性问题,进而抛出未实现错误。必须使用异步版本方法:
- 替换同步的
self.page.client_storage.get(key)为await self.page.client_storage.get_async(key) - 存储数据时对应使用
await self.page.client_storage.set_async(key, value)
2. 页面对象未正确初始化
即使你尝试移除self.page = page,如果页面类继承自ft.Page或ft.View,必须确保:
- 在
__init__中调用父类构造函数super().__init__() - 保留
self.page = page赋值,否则无法正确访问client_storage实例
修正后的初始化代码示例:
import flet as ft from telethon import TelegramClient class MainPage(ft.View): def __init__(self, page: ft.Page): super().__init__() self.page = page # 必须保留,用于访问client_storage self.clients = [] # 存储Telethon客户端实例
二、实现应用启动时自动加载账号数据
通过Flet页面的on_load事件绑定加载逻辑,确保应用启动时自动读取存储账号并初始化Telethon客户端:
1. 绑定页面加载事件
在应用入口处,将页面加载事件与账号加载函数关联:
async def main(page: ft.Page): main_page = MainPage(page) page.on_load = main_page.load_accounts # 绑定启动加载事件 await page.add_async(main_page) if __name__ == "__main__": ft.app(target=main, view=ft.AppView.FLET_APP) # 桌面端用FLET_APP,Web端用WEB_BROWSER
2. 编写异步账号加载函数
在MainPage类中实现异步加载逻辑,处理存储读取与客户端初始化:
async def load_accounts(self, e): try: # 异步读取存储的账号数据 stored_accounts = await self.page.client_storage.get_async("telegram_accounts") if not stored_accounts: print("无已存储账号") return # 遍历初始化Telethon客户端 for acc in stored_accounts: client = TelegramClient(acc["session_name"], acc["api_id"], acc["api_hash"]) await client.start() self.clients.append(client) print(f"账号 {acc['phone']} 加载成功") except Exception as e: print(f"加载账号失败: {str(e)}") # 弹窗提示用户加载失败 await self.page.show_snack_bar_async(ft.SnackBar(ft.Text(f"加载失败: {str(e)}")))
3. 配套账号存储实现
添加账号时,使用异步方法将数据存入client_storage:
async def add_account(self, session_name, api_id, api_hash, phone): # 初始化并登录Telethon客户端 client = TelegramClient(session_name, api_id, api_hash) await client.start(phone=phone) # 读取现有账号或初始化空列表 stored_accounts = await self.page.client_storage.get_async("telegram_accounts") or [] stored_accounts.append({ "session_name": session_name, "api_id": api_id, "api_hash": api_hash, "phone": phone }) # 异步存储更新后的账号列表 await self.page.client_storage.set_async("telegram_accounts", stored_accounts) self.clients.append(client)
三、额外注意事项
- 检查Flet版本是否为最新,旧版本
client_storage可能存在异步API缺失问题,执行pip install --upgrade flet更新 - 异步函数中所有涉及Flet UI操作或存储操作的代码,必须使用
await调用异步版本方法(如add_async、show_snack_bar_async) - 可通过
self.page.client_storage.path查看Flet桌面应用的默认存储路径,确保Telethon的session文件路径匹配
内容的提问来源于stack exchange,提问作者STephanDolskii
相关产品推荐
相关产品推荐

