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

解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 12:15:28