Spaces:
Paused
Paused
Update app.py
Browse files
app.py
CHANGED
@@ -668,13 +668,13 @@ with gr.Blocks(css_paths=["app.css"], theme=theme) as demo:
|
|
668 |
<p>설명을 입력하면 웹 기반 HTML5, JavaScript, CSS 게임을 생성합니다. 직관적인 인터페이스로 쉽게 게임을 만들고, 실시간으로 미리보기를 확인하세요.</p>
|
669 |
</div>
|
670 |
|
671 |
-
<!-- 배포 결과
|
672 |
-
<div id="deploy-banner"
|
673 |
<div class="deploy-banner-content">
|
674 |
<div class="deploy-banner-icon">🚀</div>
|
675 |
<div class="deploy-banner-info">
|
676 |
-
<div id="deploy-banner-title" class="deploy-banner-title">배포
|
677 |
-
<div id="deploy-banner-message" class="deploy-banner-message"
|
678 |
</div>
|
679 |
<div id="deploy-banner-url-container" class="deploy-banner-url-container" style="display:none;">
|
680 |
<a id="deploy-banner-url" href="#" target="_blank" class="deploy-banner-url"></a>
|
@@ -826,8 +826,8 @@ with gr.Blocks(css_paths=["app.css"], theme=theme) as demo:
|
|
826 |
});
|
827 |
}
|
828 |
|
829 |
-
// 배포 배너
|
830 |
-
function
|
831 |
const banner = document.getElementById('deploy-banner');
|
832 |
const bannerTitle = document.getElementById('deploy-banner-title');
|
833 |
const bannerMessage = document.getElementById('deploy-banner-message');
|
@@ -845,8 +845,6 @@ with gr.Blocks(css_paths=["app.css"], theme=theme) as demo:
|
|
845 |
} else {
|
846 |
bannerUrlContainer.style.display = 'none';
|
847 |
}
|
848 |
-
|
849 |
-
banner.style.display = 'block';
|
850 |
}
|
851 |
</script>
|
852 |
""")
|
@@ -1074,21 +1072,25 @@ with gr.Blocks(css_paths=["app.css"], theme=theme) as demo:
|
|
1074 |
except Exception as e:
|
1075 |
return {"status": "error", "message": f"배포 중 오류 발생: {str(e)}"}
|
1076 |
|
1077 |
-
# handle_deploy
|
1078 |
def handle_deploy(code, deploy_status):
|
1079 |
if not code:
|
1080 |
-
|
1081 |
-
|
1082 |
-
|
1083 |
-
|
1084 |
-
<div class="deploy-
|
1085 |
-
<div class="error
|
1086 |
-
|
|
|
|
|
1087 |
</div>
|
1088 |
-
|
|
|
|
|
1089 |
</script>
|
1090 |
"""
|
1091 |
-
return
|
1092 |
"is_deployed": False,
|
1093 |
"status": "error",
|
1094 |
"message": "배포할 코드가 없습니다.",
|
@@ -1096,40 +1098,47 @@ with gr.Blocks(css_paths=["app.css"], theme=theme) as demo:
|
|
1096 |
}
|
1097 |
|
1098 |
try:
|
1099 |
-
|
1100 |
-
|
1101 |
-
|
1102 |
-
|
1103 |
-
<div class="deploy-
|
1104 |
-
<div class="loading
|
1105 |
-
|
|
|
|
|
1106 |
</div>
|
1107 |
-
|
|
|
|
|
1108 |
</script>
|
1109 |
"""
|
1110 |
-
yield
|
1111 |
|
1112 |
clean_code = remove_code_block(code)
|
1113 |
result = deploy_to_vercel(clean_code)
|
1114 |
|
1115 |
if result.get("status") == "success":
|
1116 |
url = result.get("url")
|
1117 |
-
|
1118 |
-
<
|
1119 |
-
|
1120 |
-
|
1121 |
-
|
1122 |
-
|
1123 |
-
|
1124 |
-
|
1125 |
-
|
1126 |
-
|
|
|
1127 |
</div>
|
1128 |
</div>
|
1129 |
-
|
|
|
|
|
1130 |
</script>
|
1131 |
"""
|
1132 |
-
return
|
1133 |
"is_deployed": True,
|
1134 |
"status": "success",
|
1135 |
"url": url,
|
@@ -1137,18 +1146,21 @@ with gr.Blocks(css_paths=["app.css"], theme=theme) as demo:
|
|
1137 |
}
|
1138 |
else:
|
1139 |
error_msg = result.get("message", "알 수 없는 오류")
|
1140 |
-
|
1141 |
-
<
|
1142 |
-
|
1143 |
-
|
1144 |
-
|
1145 |
-
|
1146 |
-
|
|
|
1147 |
</div>
|
1148 |
-
|
|
|
|
|
1149 |
</script>
|
1150 |
"""
|
1151 |
-
return
|
1152 |
"is_deployed": False,
|
1153 |
"status": "error",
|
1154 |
"message": error_msg,
|
@@ -1157,18 +1169,21 @@ with gr.Blocks(css_paths=["app.css"], theme=theme) as demo:
|
|
1157 |
|
1158 |
except Exception as e:
|
1159 |
error_msg = str(e)
|
1160 |
-
|
1161 |
-
<
|
1162 |
-
|
1163 |
-
|
1164 |
-
|
1165 |
-
|
1166 |
-
|
|
|
1167 |
</div>
|
1168 |
-
|
|
|
|
|
1169 |
</script>
|
1170 |
"""
|
1171 |
-
return
|
1172 |
"is_deployed": False,
|
1173 |
"status": "error",
|
1174 |
"message": error_msg,
|
@@ -1182,15 +1197,10 @@ with gr.Blocks(css_paths=["app.css"], theme=theme) as demo:
|
|
1182 |
outputs=[deploy_result_container, deploy_status]
|
1183 |
)
|
1184 |
|
1185 |
-
|
1186 |
-
# ------------------------
|
1187 |
-
# 8) 실제 실행
|
1188 |
-
# ------------------------
|
1189 |
-
|
1190 |
if __name__ == "__main__":
|
1191 |
try:
|
1192 |
demo_instance = Demo()
|
1193 |
demo.queue(default_concurrency_limit=20).launch(ssr_mode=False)
|
1194 |
except Exception as e:
|
1195 |
print(f"Initialization error: {e}")
|
1196 |
-
raise
|
|
|
668 |
<p>설명을 입력하면 웹 기반 HTML5, JavaScript, CSS 게임을 생성합니다. 직관적인 인터페이스로 쉽게 게임을 만들고, 실시간으로 미리보기를 확인하세요.</p>
|
669 |
</div>
|
670 |
|
671 |
+
<!-- 배포 결과 배너 - 헤더 바로 아래 위치, display:none 제거 -->
|
672 |
+
<div id="deploy-banner" class="deploy-banner">
|
673 |
<div class="deploy-banner-content">
|
674 |
<div class="deploy-banner-icon">🚀</div>
|
675 |
<div class="deploy-banner-info">
|
676 |
+
<div id="deploy-banner-title" class="deploy-banner-title">배포 준비됨</div>
|
677 |
+
<div id="deploy-banner-message" class="deploy-banner-message">배포 버튼을 클릭하여 게임을 배포하세요.</div>
|
678 |
</div>
|
679 |
<div id="deploy-banner-url-container" class="deploy-banner-url-container" style="display:none;">
|
680 |
<a id="deploy-banner-url" href="#" target="_blank" class="deploy-banner-url"></a>
|
|
|
826 |
});
|
827 |
}
|
828 |
|
829 |
+
// 배포 배너 업데이트 함수
|
830 |
+
function updateDeployBanner(type, title, message, url) {
|
831 |
const banner = document.getElementById('deploy-banner');
|
832 |
const bannerTitle = document.getElementById('deploy-banner-title');
|
833 |
const bannerMessage = document.getElementById('deploy-banner-message');
|
|
|
845 |
} else {
|
846 |
bannerUrlContainer.style.display = 'none';
|
847 |
}
|
|
|
|
|
848 |
}
|
849 |
</script>
|
850 |
""")
|
|
|
1072 |
except Exception as e:
|
1073 |
return {"status": "error", "message": f"배포 중 오류 발생: {str(e)}"}
|
1074 |
|
1075 |
+
# handle_deploy 함수 수정 - JavaScript 스크립트 대신 HTML을 직접 반환하고 DOM 업데이트
|
1076 |
def handle_deploy(code, deploy_status):
|
1077 |
if not code:
|
1078 |
+
# HTML 직접 반환 - JavaScript 없이 결과 표시
|
1079 |
+
result_html = """
|
1080 |
+
<div class="deploy-section">
|
1081 |
+
<div class="deploy-header">📤 배포 결과</div>
|
1082 |
+
<div id="deploy-result-box" class="deploy-result-box">
|
1083 |
+
<div class="deploy-error">
|
1084 |
+
<div class="error-icon">⚠️</div>
|
1085 |
+
<div class="error-message">배포할 코드가 없습니다.</div>
|
1086 |
+
</div>
|
1087 |
</div>
|
1088 |
+
</div>
|
1089 |
+
<script>
|
1090 |
+
updateDeployBanner('error', '⚠️ 배포 실패', '배포할 코드가 없습니다. 먼저 게임 코드를 생성해주세요.');
|
1091 |
</script>
|
1092 |
"""
|
1093 |
+
return result_html, {
|
1094 |
"is_deployed": False,
|
1095 |
"status": "error",
|
1096 |
"message": "배포할 코드가 없습니다.",
|
|
|
1098 |
}
|
1099 |
|
1100 |
try:
|
1101 |
+
# 로딩 상태 표시
|
1102 |
+
loading_html = """
|
1103 |
+
<div class="deploy-section">
|
1104 |
+
<div class="deploy-header">📤 배포 결과</div>
|
1105 |
+
<div id="deploy-result-box" class="deploy-result-box">
|
1106 |
+
<div class="deploy-loading">
|
1107 |
+
<div class="loading-spinner"></div>
|
1108 |
+
<div class="loading-message">Vercel에 배포 중입니다...</div>
|
1109 |
+
</div>
|
1110 |
</div>
|
1111 |
+
</div>
|
1112 |
+
<script>
|
1113 |
+
updateDeployBanner('loading', '🔄 배포 진행 중', 'Vercel에 게임을 배포하고 있습니다. 잠시만 기다려주세요.');
|
1114 |
</script>
|
1115 |
"""
|
1116 |
+
yield loading_html, deploy_status
|
1117 |
|
1118 |
clean_code = remove_code_block(code)
|
1119 |
result = deploy_to_vercel(clean_code)
|
1120 |
|
1121 |
if result.get("status") == "success":
|
1122 |
url = result.get("url")
|
1123 |
+
success_html = f"""
|
1124 |
+
<div class="deploy-section">
|
1125 |
+
<div class="deploy-header">📤 배포 결과</div>
|
1126 |
+
<div id="deploy-result-box" class="deploy-result-box">
|
1127 |
+
<div class="deploy-success">
|
1128 |
+
<div class="success-icon">✅</div>
|
1129 |
+
<div class="success-message">배포 완료!</div>
|
1130 |
+
<div class="url-box">
|
1131 |
+
<a href="{url}" target="_blank">{url}</a>
|
1132 |
+
<button class="copy-btn" onclick="navigator.clipboard.writeText('{url}')">복사</button>
|
1133 |
+
</div>
|
1134 |
</div>
|
1135 |
</div>
|
1136 |
+
</div>
|
1137 |
+
<script>
|
1138 |
+
updateDeployBanner('success', '✅ 배포 완료!', '게임이 성공적으로 Vercel에 배포되었습니다.', '{url}');
|
1139 |
</script>
|
1140 |
"""
|
1141 |
+
return success_html, {
|
1142 |
"is_deployed": True,
|
1143 |
"status": "success",
|
1144 |
"url": url,
|
|
|
1146 |
}
|
1147 |
else:
|
1148 |
error_msg = result.get("message", "알 수 없는 오류")
|
1149 |
+
error_html = f"""
|
1150 |
+
<div class="deploy-section">
|
1151 |
+
<div class="deploy-header">📤 배포 결과</div>
|
1152 |
+
<div id="deploy-result-box" class="deploy-result-box">
|
1153 |
+
<div class="deploy-error">
|
1154 |
+
<div class="error-icon">⚠️</div>
|
1155 |
+
<div class="error-message">배포 실패: {error_msg}</div>
|
1156 |
+
</div>
|
1157 |
</div>
|
1158 |
+
</div>
|
1159 |
+
<script>
|
1160 |
+
updateDeployBanner('error', '⚠️ 배포 실패', '{error_msg}');
|
1161 |
</script>
|
1162 |
"""
|
1163 |
+
return error_html, {
|
1164 |
"is_deployed": False,
|
1165 |
"status": "error",
|
1166 |
"message": error_msg,
|
|
|
1169 |
|
1170 |
except Exception as e:
|
1171 |
error_msg = str(e)
|
1172 |
+
exception_html = f"""
|
1173 |
+
<div class="deploy-section">
|
1174 |
+
<div class="deploy-header">📤 배포 결과</div>
|
1175 |
+
<div id="deploy-result-box" class="deploy-result-box">
|
1176 |
+
<div class="deploy-error">
|
1177 |
+
<div class="error-icon">⚠️</div>
|
1178 |
+
<div class="error-message">시스템 오류: {error_msg}</div>
|
1179 |
+
</div>
|
1180 |
</div>
|
1181 |
+
</div>
|
1182 |
+
<script>
|
1183 |
+
updateDeployBanner('error', '⚠️ 시스템 오류', '{error_msg}');
|
1184 |
</script>
|
1185 |
"""
|
1186 |
+
return exception_html, {
|
1187 |
"is_deployed": False,
|
1188 |
"status": "error",
|
1189 |
"message": error_msg,
|
|
|
1197 |
outputs=[deploy_result_container, deploy_status]
|
1198 |
)
|
1199 |
|
|
|
|
|
|
|
|
|
|
|
1200 |
if __name__ == "__main__":
|
1201 |
try:
|
1202 |
demo_instance = Demo()
|
1203 |
demo.queue(default_concurrency_limit=20).launch(ssr_mode=False)
|
1204 |
except Exception as e:
|
1205 |
print(f"Initialization error: {e}")
|
1206 |
+
raise
|