Spaces:
Runtime error
Runtime error
Upload 2 files
Browse files- main_app.py +24 -13
- persistent_user_manager.py +57 -38
main_app.py
CHANGED
|
@@ -182,10 +182,20 @@ def run_async(coro):
|
|
| 182 |
|
| 183 |
def update_background(scene_manager: SceneManager, theme: str):
|
| 184 |
"""現在のテーマに基づいて背景画像を動的に設定するCSSを注入する(重複実行防止)"""
|
| 185 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 186 |
|
| 187 |
-
|
| 188 |
-
logger.info(f"背景更新を実行します - テーマ: {theme} (スキップ機能無効)")
|
| 189 |
|
| 190 |
try:
|
| 191 |
logger.info(f"背景更新を開始します - テーマ: {theme}")
|
|
@@ -392,9 +402,12 @@ def update_background(scene_manager: SceneManager, theme: str):
|
|
| 392 |
if st.session_state.get("debug_mode", False) and image_url:
|
| 393 |
st.success(f"🖼️ 背景更新: {theme}")
|
| 394 |
|
| 395 |
-
#
|
|
|
|
| 396 |
st.session_state.last_background_theme = theme
|
| 397 |
|
|
|
|
|
|
|
| 398 |
except Exception as e:
|
| 399 |
logger.error(f"背景更新エラー: {e}")
|
| 400 |
import traceback
|
|
@@ -412,7 +425,11 @@ def update_background(scene_manager: SceneManager, theme: str):
|
|
| 412 |
</style>
|
| 413 |
"""
|
| 414 |
st.markdown(fallback_css, unsafe_allow_html=True)
|
|
|
|
| 415 |
st.session_state.last_background_theme = theme
|
|
|
|
|
|
|
|
|
|
| 416 |
|
| 417 |
# --- ▼▼▼ 1. 初期化処理の一元管理 ▼▼▼ ---
|
| 418 |
|
|
@@ -1184,10 +1201,8 @@ def render_chat_tab(managers):
|
|
| 1184 |
# 背景を更新
|
| 1185 |
try:
|
| 1186 |
current_theme = st.session_state.chat['scene_params'].get("theme", "default")
|
| 1187 |
-
logger.
|
| 1188 |
-
logger.info(f"update_background関数を呼び出します...")
|
| 1189 |
update_background(managers['scene_manager'], current_theme)
|
| 1190 |
-
logger.info(f"update_background関数の呼び出しが完了しました")
|
| 1191 |
except Exception as e:
|
| 1192 |
logger.error(f"チャットタブ背景更新でエラーが発生: {e}")
|
| 1193 |
import traceback
|
|
@@ -2246,10 +2261,8 @@ Streamlit情報:
|
|
| 2246 |
|
| 2247 |
# シーン変更時に背景を更新
|
| 2248 |
try:
|
| 2249 |
-
logger.
|
| 2250 |
-
logger.info(f"update_background関数を呼び出します...")
|
| 2251 |
update_background(managers['scene_manager'], new_theme)
|
| 2252 |
-
logger.info(f"update_background関数の呼び出しが完了しました")
|
| 2253 |
except Exception as e:
|
| 2254 |
logger.error(f"シーン変更時の背景更新でエラーが発生: {e}")
|
| 2255 |
import traceback
|
|
@@ -3002,12 +3015,10 @@ def main():
|
|
| 3002 |
# CSS読み込み完了後に背景を更新(初期設定)
|
| 3003 |
try:
|
| 3004 |
initial_theme = st.session_state.chat['scene_params'].get('theme', 'default')
|
| 3005 |
-
logger.
|
| 3006 |
-
logger.info(f"update_background関数を呼び出します...")
|
| 3007 |
|
| 3008 |
# 常に背景を更新(CSS読み込み待ちなし)
|
| 3009 |
update_background(managers['scene_manager'], initial_theme)
|
| 3010 |
-
logger.info(f"初期背景設定完了")
|
| 3011 |
|
| 3012 |
except Exception as e:
|
| 3013 |
logger.error(f"初期背景設定でエラーが発生: {e}")
|
|
|
|
| 182 |
|
| 183 |
def update_background(scene_manager: SceneManager, theme: str):
|
| 184 |
"""現在のテーマに基づいて背景画像を動的に設定するCSSを注入する(重複実行防止)"""
|
| 185 |
+
# 重複実行防止: 同じテーマで既に更新済みの場合はスキップ
|
| 186 |
+
current_background_theme = st.session_state.get('current_background_theme', None)
|
| 187 |
+
if current_background_theme == theme:
|
| 188 |
+
logger.debug(f"背景更新スキップ - 既に同じテーマ適用済み: {theme}")
|
| 189 |
+
return
|
| 190 |
+
|
| 191 |
+
logger.info(f"背景更新開始 - テーマ: {theme}")
|
| 192 |
+
|
| 193 |
+
# 背景更新中フラグを設定(重複呼び出し防止)
|
| 194 |
+
if st.session_state.get('background_updating', False):
|
| 195 |
+
logger.debug(f"背景更新中 - スキップ: {theme}")
|
| 196 |
+
return
|
| 197 |
|
| 198 |
+
st.session_state.background_updating = True
|
|
|
|
| 199 |
|
| 200 |
try:
|
| 201 |
logger.info(f"背景更新を開始します - テーマ: {theme}")
|
|
|
|
| 402 |
if st.session_state.get("debug_mode", False) and image_url:
|
| 403 |
st.success(f"🖼️ 背景更新: {theme}")
|
| 404 |
|
| 405 |
+
# 現在のテーマを記録(重複実行防止用)
|
| 406 |
+
st.session_state.current_background_theme = theme
|
| 407 |
st.session_state.last_background_theme = theme
|
| 408 |
|
| 409 |
+
logger.info(f"背景更新完了 - テーマ: {theme}")
|
| 410 |
+
|
| 411 |
except Exception as e:
|
| 412 |
logger.error(f"背景更新エラー: {e}")
|
| 413 |
import traceback
|
|
|
|
| 425 |
</style>
|
| 426 |
"""
|
| 427 |
st.markdown(fallback_css, unsafe_allow_html=True)
|
| 428 |
+
st.session_state.current_background_theme = theme
|
| 429 |
st.session_state.last_background_theme = theme
|
| 430 |
+
finally:
|
| 431 |
+
# 背景更新中フラグをクリア
|
| 432 |
+
st.session_state.background_updating = False
|
| 433 |
|
| 434 |
# --- ▼▼▼ 1. 初期化処理の一元管理 ▼▼▼ ---
|
| 435 |
|
|
|
|
| 1201 |
# 背景を更新
|
| 1202 |
try:
|
| 1203 |
current_theme = st.session_state.chat['scene_params'].get("theme", "default")
|
| 1204 |
+
logger.debug(f"チャットタブ背景更新: テーマ '{current_theme}'")
|
|
|
|
| 1205 |
update_background(managers['scene_manager'], current_theme)
|
|
|
|
| 1206 |
except Exception as e:
|
| 1207 |
logger.error(f"チャットタブ背景更新でエラーが発生: {e}")
|
| 1208 |
import traceback
|
|
|
|
| 2261 |
|
| 2262 |
# シーン変更時に背景を更新
|
| 2263 |
try:
|
| 2264 |
+
logger.debug(f"シーン変更時の背景更新: テーマ '{new_theme}'")
|
|
|
|
| 2265 |
update_background(managers['scene_manager'], new_theme)
|
|
|
|
| 2266 |
except Exception as e:
|
| 2267 |
logger.error(f"シーン変更時の背景更新でエラーが発生: {e}")
|
| 2268 |
import traceback
|
|
|
|
| 3015 |
# CSS読み込み完了後に背景を更新(初期設定)
|
| 3016 |
try:
|
| 3017 |
initial_theme = st.session_state.chat['scene_params'].get('theme', 'default')
|
| 3018 |
+
logger.debug(f"初期背景設定: テーマ '{initial_theme}'")
|
|
|
|
| 3019 |
|
| 3020 |
# 常に背景を更新(CSS読み込み待ちなし)
|
| 3021 |
update_background(managers['scene_manager'], initial_theme)
|
|
|
|
| 3022 |
|
| 3023 |
except Exception as e:
|
| 3024 |
logger.error(f"初期背景設定でエラーが発生: {e}")
|
persistent_user_manager.py
CHANGED
|
@@ -110,47 +110,66 @@ class PersistentUserManager:
|
|
| 110 |
ユーザーID
|
| 111 |
"""
|
| 112 |
try:
|
| 113 |
-
#
|
| 114 |
-
if
|
| 115 |
-
|
| 116 |
-
|
| 117 |
-
|
| 118 |
-
return
|
| 119 |
-
|
| 120 |
-
|
| 121 |
-
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
user_id = self._get_user_id_from_cookie()
|
| 125 |
-
|
| 126 |
-
if user_id and self._is_valid_user_id(user_id):
|
| 127 |
-
# 有効なCookieベースのユーザーIDが存在
|
| 128 |
-
self._update_user_access_time(user_id)
|
| 129 |
-
st.session_state.user_id = user_id # セッション状態に保存
|
| 130 |
-
logger.info(f"Cookie認証成功: {user_id[:8]}...")
|
| 131 |
-
return user_id
|
| 132 |
-
|
| 133 |
-
# 2. Cookieが無効または存在しない場合は新規作成
|
| 134 |
-
if force_reset or not user_id:
|
| 135 |
-
user_id = self._create_new_user_with_cookie()
|
| 136 |
-
logger.info(f"新規Cookie認証ユーザー作成: {user_id[:8]}...")
|
| 137 |
-
return user_id
|
| 138 |
-
|
| 139 |
-
# 3. 最終フォールバック(Cookieが無効だが何らかのIDがある場合)
|
| 140 |
-
if user_id and self._is_valid_uuid(user_id):
|
| 141 |
-
# UUIDとして有効だが、ユーザーファイルが存在しない場合は新規作成
|
| 142 |
-
user_id = self._create_new_user_with_cookie()
|
| 143 |
-
logger.info(f"フォールバック新規ユーザー作成: {user_id[:8]}...")
|
| 144 |
-
return user_id
|
| 145 |
-
|
| 146 |
-
# 4. 完全フォールバック(Cookie無効時)
|
| 147 |
-
logger.warning("Cookie認証失敗 - 一時的なセッションIDを使用")
|
| 148 |
-
temp_id = str(uuid.uuid4())
|
| 149 |
-
st.session_state.user_id = temp_id
|
| 150 |
-
return temp_id
|
| 151 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 152 |
except Exception as e:
|
| 153 |
logger.error(f"Cookie認証エラー: {e}")
|
|
|
|
|
|
|
| 154 |
# 完全フォールバック: 一時的なIDを生成(Cookieに保存しない)
|
| 155 |
temp_id = str(uuid.uuid4())
|
| 156 |
st.session_state.user_id = temp_id
|
|
|
|
| 110 |
ユーザーID
|
| 111 |
"""
|
| 112 |
try:
|
| 113 |
+
# 重複呼び出し防止: 処理中フラグをチェック
|
| 114 |
+
if st.session_state.get('user_id_processing', False):
|
| 115 |
+
logger.debug("ユーザーID取得処理中 - 待機")
|
| 116 |
+
# 既存のuser_idがあればそれを返す
|
| 117 |
+
if 'user_id' in st.session_state:
|
| 118 |
+
return st.session_state.user_id
|
| 119 |
+
# なければ一時的なIDを返す
|
| 120 |
+
return f"temp_{id(st.session_state)}"
|
| 121 |
+
|
| 122 |
+
# 処理中フラグを設定
|
| 123 |
+
st.session_state.user_id_processing = True
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 124 |
|
| 125 |
+
try:
|
| 126 |
+
# フルリセット時以外で、既にセッション状態にuser_idがある場合はそれを使用
|
| 127 |
+
if not force_reset and 'user_id' in st.session_state:
|
| 128 |
+
existing_id = st.session_state.user_id
|
| 129 |
+
if existing_id and self._is_valid_uuid(existing_id):
|
| 130 |
+
logger.debug(f"セッション状態からユーザーID使用: {existing_id[:8]}...")
|
| 131 |
+
return existing_id
|
| 132 |
+
|
| 133 |
+
# Cookie管理システムを初期化(ブラウザごとに一度だけ)
|
| 134 |
+
self._ensure_cookie_manager(force_init=force_reset)
|
| 135 |
+
|
| 136 |
+
# 1. CookieからユーザーIDを取得(最優先)
|
| 137 |
+
user_id = self._get_user_id_from_cookie()
|
| 138 |
+
|
| 139 |
+
if user_id and self._is_valid_user_id(user_id):
|
| 140 |
+
# 有効なCookieベースのユーザーIDが存在
|
| 141 |
+
self._update_user_access_time(user_id)
|
| 142 |
+
st.session_state.user_id = user_id # セッション状態に保存
|
| 143 |
+
logger.info(f"Cookie認証成功: {user_id[:8]}...")
|
| 144 |
+
return user_id
|
| 145 |
+
|
| 146 |
+
# 2. Cookieが無効または存在しない場合は新規作成
|
| 147 |
+
if force_reset or not user_id:
|
| 148 |
+
user_id = self._create_new_user_with_cookie()
|
| 149 |
+
logger.info(f"新規Cookie認証ユーザー作成: {user_id[:8]}...")
|
| 150 |
+
return user_id
|
| 151 |
+
|
| 152 |
+
# 3. 最終フォールバック(Cookieが無効だが何らかのIDがある場合)
|
| 153 |
+
if user_id and self._is_valid_uuid(user_id):
|
| 154 |
+
# UUIDとして有効だが、ユーザーファイルが存在しない場合は新規作成
|
| 155 |
+
user_id = self._create_new_user_with_cookie()
|
| 156 |
+
logger.info(f"フォールバック新規ユーザー作成: {user_id[:8]}...")
|
| 157 |
+
return user_id
|
| 158 |
+
|
| 159 |
+
# 4. 完全フォールバック(Cookie無効時)
|
| 160 |
+
logger.warning("Cookie認証失敗 - 一時的なセッションIDを使用")
|
| 161 |
+
temp_id = str(uuid.uuid4())
|
| 162 |
+
st.session_state.user_id = temp_id
|
| 163 |
+
return temp_id
|
| 164 |
+
|
| 165 |
+
finally:
|
| 166 |
+
# 処理中フラグをクリア
|
| 167 |
+
st.session_state.user_id_processing = False
|
| 168 |
+
|
| 169 |
except Exception as e:
|
| 170 |
logger.error(f"Cookie認証エラー: {e}")
|
| 171 |
+
# 処理中フラグをクリア
|
| 172 |
+
st.session_state.user_id_processing = False
|
| 173 |
# 完全フォールバック: 一時的なIDを生成(Cookieに保存しない)
|
| 174 |
temp_id = str(uuid.uuid4())
|
| 175 |
st.session_state.user_id = temp_id
|