sirochild commited on
Commit
2f464f1
·
verified ·
1 Parent(s): 27f915e

Upload 2 files

Browse files
Files changed (2) hide show
  1. main_app.py +36 -7
  2. persistent_user_manager.py +29 -11
main_app.py CHANGED
@@ -403,12 +403,12 @@ def update_background(scene_manager: SceneManager, theme: str):
403
  # --- ▼▼▼ 1. 初期化処理の一元管理 ▼▼▼ ---
404
 
405
  @st.cache_resource
406
- def initialize_all_managers():
407
  """
408
- アプリケーション全体で共有する全ての管理クラスを初期化する
409
- Streamlitのキャッシュ機能により、シングルトンとして振る舞う
410
  """
411
- logger.info("Initializing all managers...")
412
  # --- 手紙機能の依存モジュール ---
413
  letter_storage = AsyncStorageManager(Config.STORAGE_PATH)
414
  letter_rate_limiter = AsyncRateLimitManager(letter_storage, max_requests=Config.MAX_DAILY_REQUESTS)
@@ -430,9 +430,8 @@ def initialize_all_managers():
430
  tutorial_manager = TutorialManager()
431
  session_api_client = SessionAPIClient()
432
  user_id_manager = UserIDManager() # ユーザーID永続化管理
433
- persistent_user_manager = PersistentUserManager() # HF Spaces永続ストレージ管理
434
 
435
- logger.info("All managers initialized.")
436
  return {
437
  # 手紙用
438
  "user_manager": user_manager,
@@ -450,9 +449,39 @@ def initialize_all_managers():
450
  "tutorial_manager": tutorial_manager,
451
  "session_api_client": session_api_client,
452
  "user_id_manager": user_id_manager, # ユーザーID永続化管理
453
- "persistent_user_manager": persistent_user_manager, # HF Spaces永続ストレージ管理
454
  }
455
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
456
  def initialize_session_state(managers, force_reset_override=False):
457
  """
458
  アプリケーション全体のセッションステートを初期化する
 
403
  # --- ▼▼▼ 1. 初期化処理の一元管理 ▼▼▼ ---
404
 
405
  @st.cache_resource
406
+ def initialize_cached_managers():
407
  """
408
+ キャッシュ可能な管理クラスのみを初期化する
409
+ Streamlitコンポーネントを使用しないクラスのみ
410
  """
411
+ logger.info("Initializing cached managers...")
412
  # --- 手紙機能の依存モジュール ---
413
  letter_storage = AsyncStorageManager(Config.STORAGE_PATH)
414
  letter_rate_limiter = AsyncRateLimitManager(letter_storage, max_requests=Config.MAX_DAILY_REQUESTS)
 
430
  tutorial_manager = TutorialManager()
431
  session_api_client = SessionAPIClient()
432
  user_id_manager = UserIDManager() # ユーザーID永続化管理
 
433
 
434
+ logger.info("Cached managers initialized.")
435
  return {
436
  # 手紙用
437
  "user_manager": user_manager,
 
449
  "tutorial_manager": tutorial_manager,
450
  "session_api_client": session_api_client,
451
  "user_id_manager": user_id_manager, # ユーザーID永続化管理
 
452
  }
453
 
454
+ def initialize_session_managers():
455
+ """
456
+ セッション単位で初期化が必要な管理クラスを初期化する
457
+ Streamlitコンポーネントを使用するクラス
458
+ """
459
+ logger.info("Initializing session managers...")
460
+
461
+ # Cookie管理を含む永続ユーザー管理(キャッシュ外で初期化)
462
+ persistent_user_manager = PersistentUserManager()
463
+
464
+ logger.info("Session managers initialized.")
465
+ return {
466
+ "persistent_user_manager": persistent_user_manager,
467
+ }
468
+
469
+ def initialize_all_managers():
470
+ """
471
+ 全ての管理クラスを初期化する(キャッシュ対応版)
472
+ """
473
+ # キャッシュ可能なマネージャーを取得
474
+ cached_managers = initialize_cached_managers()
475
+
476
+ # セッション単位のマネージャーを取得
477
+ session_managers = initialize_session_managers()
478
+
479
+ # 統合して返す
480
+ all_managers = {**cached_managers, **session_managers}
481
+
482
+ logger.info("All managers initialized (cache-aware).")
483
+ return all_managers
484
+
485
  def initialize_session_state(managers, force_reset_override=False):
486
  """
487
  アプリケーション全体のセッションステートを初期化する
persistent_user_manager.py CHANGED
@@ -35,8 +35,9 @@ class PersistentUserManager:
35
  # ディレクトリ作成
36
  self._ensure_directories()
37
 
38
- # Cookie管理の初期化
39
- self.cookies = self._init_cookie_manager()
 
40
 
41
  logger.info(f"永続ユーザー管理システム初期化: {self.user_data_dir}")
42
 
@@ -55,8 +56,11 @@ class PersistentUserManager:
55
  os.makedirs(self.session_data_dir, exist_ok=True)
56
  logger.warning(f"フォールバック: ローカルディレクトリを使用 {self.user_data_dir}")
57
 
58
- def _init_cookie_manager(self) -> EncryptedCookieManager:
59
- """Cookie管理システムを初期化"""
 
 
 
60
  try:
61
  # セキュアなパスワードを生成(環境変数から取得、なければ生成)
62
  cookie_password = os.getenv("MARI_COOKIE_PASSWORD", "mari_chat_secure_key_2024")
@@ -70,13 +74,15 @@ class PersistentUserManager:
70
  if not cookies.ready():
71
  st.stop()
72
 
73
- logger.info("Cookie管理システム初期化完了")
74
- return cookies
 
75
 
76
  except Exception as e:
77
  logger.error(f"Cookie管理初期化エラー: {e}")
78
  # フォールバック: セッション状態のみ使用
79
- return None
 
80
 
81
  def get_or_create_user_id(self) -> str:
82
  """
@@ -131,6 +137,9 @@ class PersistentUserManager:
131
  def _get_user_id_from_cookie(self) -> Optional[str]:
132
  """CookieからユーザーIDを取得"""
133
  try:
 
 
 
134
  if self.cookies is None:
135
  return None
136
 
@@ -147,6 +156,9 @@ class PersistentUserManager:
147
  def _set_user_id_cookie(self, user_id: str):
148
  """ユーザーIDをCookieに設定"""
149
  try:
 
 
 
150
  if self.cookies is None:
151
  return
152
 
@@ -355,10 +367,16 @@ class PersistentUserManager:
355
  logger.info(f"ユーザーデータ削除: {user_id[:8]}...")
356
 
357
  # Cookieも削除
358
- if self.cookies:
359
- if self.cookie_name in self.cookies:
360
- del self.cookies[self.cookie_name]
361
- self.cookies.save()
 
 
 
 
 
 
362
 
363
  # セッション状態からも削除
364
  if 'persistent_user_id' in st.session_state:
 
35
  # ディレクトリ作成
36
  self._ensure_directories()
37
 
38
+ # Cookie管理の遅延初期化(初回使用時に初期化)
39
+ self.cookies = None
40
+ self._cookie_initialized = False
41
 
42
  logger.info(f"永続ユーザー管理システム初期化: {self.user_data_dir}")
43
 
 
56
  os.makedirs(self.session_data_dir, exist_ok=True)
57
  logger.warning(f"フォールバック: ローカルディレクトリを使用 {self.user_data_dir}")
58
 
59
+ def _ensure_cookie_manager(self):
60
+ """Cookie管理システムの遅延初期化"""
61
+ if self._cookie_initialized:
62
+ return
63
+
64
  try:
65
  # セキュアなパスワードを生成(環境変数から取得、なければ生成)
66
  cookie_password = os.getenv("MARI_COOKIE_PASSWORD", "mari_chat_secure_key_2024")
 
74
  if not cookies.ready():
75
  st.stop()
76
 
77
+ self.cookies = cookies
78
+ self._cookie_initialized = True
79
+ logger.info("Cookie管理システム遅延初期化完了")
80
 
81
  except Exception as e:
82
  logger.error(f"Cookie管理初期化エラー: {e}")
83
  # フォールバック: セッション状態のみ使用
84
+ self.cookies = None
85
+ self._cookie_initialized = True
86
 
87
  def get_or_create_user_id(self) -> str:
88
  """
 
137
  def _get_user_id_from_cookie(self) -> Optional[str]:
138
  """CookieからユーザーIDを取得"""
139
  try:
140
+ # Cookie管理の遅延初期化
141
+ self._ensure_cookie_manager()
142
+
143
  if self.cookies is None:
144
  return None
145
 
 
156
  def _set_user_id_cookie(self, user_id: str):
157
  """ユーザーIDをCookieに設定"""
158
  try:
159
+ # Cookie管理の遅延初期化
160
+ self._ensure_cookie_manager()
161
+
162
  if self.cookies is None:
163
  return
164
 
 
367
  logger.info(f"ユーザーデータ削除: {user_id[:8]}...")
368
 
369
  # Cookieも削除
370
+ try:
371
+ # Cookie管理の遅延初期化
372
+ self._ensure_cookie_manager()
373
+
374
+ if self.cookies:
375
+ if self.cookie_name in self.cookies:
376
+ del self.cookies[self.cookie_name]
377
+ self.cookies.save()
378
+ except Exception as e:
379
+ logger.warning(f"Cookie削除エラー: {e}")
380
 
381
  # セッション状態からも削除
382
  if 'persistent_user_id' in st.session_state: