Kivy多屏幕间Token传递及安全存储技术问题咨询
Kivy Token传递与安全存储解决方案
一、跨屏幕传递Token
直接利用Kivy的ScreenManager或App实例共享状态最靠谱:
- 方案1:ScreenManager挂载状态容器
在main.py的ScreenManager子类里加个字典存全局状态,所有屏幕通过self.manager就能访问:
登录成功后,LoginScreen里写self.manager.app_state['token'] = 接口返回的token;SettingsScreen需要时直接读token = self.manager.app_state.get('token') - 方案2:App类全局属性
在MyApp里初始化self.token = None,LoginScreen通过self.app = App.get_running_app()拿到实例,然后self.app.token = 登录返回的token;SettingsScreen直接用App.get_running_app().token读取
两种方案任选,ScreenManager的方式更清晰,适合多状态共享的场景。
二、安全存储Token(防用户直接访问)
别用普通文件或明文存储,用系统级安全存储方案:
- 用
plyer库的secure_storage模块,Android会调用系统Keystore服务,iOS用Keychain,存储的内容加密且只有你的App能访问 - 步骤:
- 安装依赖:
pip install plyer - 封装一个简单的存储工具类,统一处理读写逻辑:
from plyer import secure_storage class SecureTokenStorage: def __init__(self): self.storage = secure_storage.SecureStorage() def save_token(self, token): self.storage.set("user_token", token) def get_token(self): return self.storage.get("user_token") def delete_token(self): self.storage.delete("user_token") - 登录成功后调用
SecureTokenStorage().save_token(token)持久化Token - App启动时先调用
get_token(),如果存在有效Token,直接跳转到主界面,无需重复登录
- 安装依赖:
三、适配你的项目结构的代码示例
main.py
from kivy.app import App from kivy.uix.screenmanager import ScreenManager from login import LoginScreen from settings import SettingsScreen from storage import SecureTokenStorage # 假设存储类放在storage.py中 class CentralScreenManager(ScreenManager): def __init__(self, **kwargs): super().__init__(**kwargs) self.app_state = {} # 全局状态容器 class MyApp(App): def build(self): sm = CentralScreenManager() # 启动时检查本地存储的Token storage = SecureTokenStorage() saved_token = storage.get_token() if saved_token: sm.app_state['token'] = saved_token sm.current = 'settings' else: sm.current = 'login' # 注册所有屏幕 sm.add_widget(LoginScreen(name='login')) sm.add_widget(SettingsScreen(name='settings')) return sm if __name__ == '__main__': MyApp().run()
login.py
from kivy.uix.screenmanager import Screen from storage import SecureTokenStorage class LoginScreen(Screen): def handle_login(self): # 此处编写登录请求逻辑,示例中假设已获取到token token = "接口返回的有效Token" # 存入全局状态容器 self.manager.app_state['token'] = token # 安全存储Token SecureTokenStorage().save_token(token) # 跳转到设置页面 self.manager.current = 'settings'
settings.py
from kivy.uix.screenmanager import Screen class SettingsScreen(Screen): def on_enter(self): token = self.manager.app_state.get('token') if not token: # 无有效Token时跳转回登录页 self.manager.current = 'login' return # 携带Token请求用户设置等业务逻辑 self.fetch_user_settings(token) def fetch_user_settings(self, token): # 此处编写带Token的接口请求逻辑 pass
内容的提问来源于stack exchange,提问作者9acca9
相关产品推荐
相关产品推荐

