Spaces:
Runtime error
Runtime error
Upload 2 files
Browse files- main_app.py +36 -7
- 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
|
| 407 |
"""
|
| 408 |
-
|
| 409 |
-
Streamlit
|
| 410 |
"""
|
| 411 |
-
logger.info("Initializing
|
| 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("
|
| 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 =
|
|
|
|
| 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
|
| 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 |
-
|
| 74 |
-
|
|
|
|
| 75 |
|
| 76 |
except Exception as e:
|
| 77 |
logger.error(f"Cookie管理初期化エラー: {e}")
|
| 78 |
# フォールバック: セッション状態のみ使用
|
| 79 |
-
|
|
|
|
| 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 |
-
|
| 359 |
-
|
| 360 |
-
|
| 361 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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:
|