Spaces:
Paused
Paused
Update app.py
Browse files
app.py
CHANGED
|
@@ -647,12 +647,9 @@ class Demo:
|
|
| 647 |
|
| 648 |
|
| 649 |
|
| 650 |
-
|
| 651 |
-
#
|
| 652 |
-
|
| 653 |
-
###############################################
|
| 654 |
-
# 1) deploy_to_vercel 함수 (로깅 및 HTML 반환)
|
| 655 |
-
###############################################
|
| 656 |
def deploy_to_vercel(code: str):
|
| 657 |
print("[DEBUG] deploy_to_vercel() 시작. code 길이:", len(code) if code else 0)
|
| 658 |
try:
|
|
@@ -768,90 +765,39 @@ def deploy_to_vercel(code: str):
|
|
| 768 |
"""
|
| 769 |
|
| 770 |
|
| 771 |
-
|
| 772 |
-
# 2)
|
| 773 |
-
|
| 774 |
-
def
|
| 775 |
-
print("[DEBUG]
|
| 776 |
-
|
|
|
|
|
|
|
| 777 |
|
| 778 |
-
|
| 779 |
-
|
| 780 |
-
|
| 781 |
-
console.log('[DEBUG] 배포할 코드가 없어 에러 처리');
|
| 782 |
-
showDeployBanner('error', '⚠️ 배포 실패', '배포할 코드가 없습니다. 먼저 게임 코드를 생성해주세요.');
|
| 783 |
-
document.getElementById('deploy-result-box').innerHTML = `
|
| 784 |
-
<div class="deploy-error">
|
| 785 |
-
<div class="error-icon">⚠️</div>
|
| 786 |
-
<div class="error-message">배포할 코드가 없습니다.</div>
|
| 787 |
-
</div>
|
| 788 |
-
`;
|
| 789 |
-
</script>
|
| 790 |
-
"""
|
| 791 |
-
print("[DEBUG] code가 없으므로 에러 HTML 반환")
|
| 792 |
-
return js_code, {
|
| 793 |
-
"is_deployed": False,
|
| 794 |
-
"status": "error",
|
| 795 |
-
"message": "배포할 코드가 없습니다.",
|
| 796 |
-
"url": ""
|
| 797 |
-
}
|
| 798 |
|
| 799 |
-
|
| 800 |
-
|
| 801 |
-
|
| 802 |
-
print("[DEBUG] remove_code_block 후 clean_code 길이:", len(clean_code))
|
| 803 |
|
| 804 |
-
|
| 805 |
-
|
| 806 |
-
|
| 807 |
-
print(result_html[:500], "..." if len(result_html) > 500 else "")
|
| 808 |
|
| 809 |
-
|
| 810 |
-
|
| 811 |
-
|
| 812 |
-
|
| 813 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 814 |
|
| 815 |
-
final_html = result_html + debug_injection
|
| 816 |
-
|
| 817 |
-
if "✅ 배포 완료!" in result_html:
|
| 818 |
-
print("[DEBUG] 배포 성공으로 판단")
|
| 819 |
-
return final_html, {
|
| 820 |
-
"is_deployed": True,
|
| 821 |
-
"status": "success",
|
| 822 |
-
"url": "",
|
| 823 |
-
"message": "배포 성공"
|
| 824 |
-
}
|
| 825 |
-
else:
|
| 826 |
-
print("[DEBUG] 배포 실패 또는 오류")
|
| 827 |
-
return final_html, {
|
| 828 |
-
"is_deployed": False,
|
| 829 |
-
"status": "error",
|
| 830 |
-
"url": "",
|
| 831 |
-
"message": "배포 실패"
|
| 832 |
-
}
|
| 833 |
|
| 834 |
-
except Exception as e:
|
| 835 |
-
error_msg = str(e)
|
| 836 |
-
print("[ERROR] handle_deploy에서 예외 발생:", error_msg)
|
| 837 |
-
exception_js = f"""
|
| 838 |
-
<script>
|
| 839 |
-
console.log('[DEBUG] handle_deploy 예외: {error_msg}');
|
| 840 |
-
showDeployBanner('error', '⚠️ 시스템 오류', '{error_msg}');
|
| 841 |
-
document.getElementById('deploy-result-box').innerHTML = `
|
| 842 |
-
<div class="deploy-error">
|
| 843 |
-
<div class="error-icon">⚠️</div>
|
| 844 |
-
<div class="error-message">시스템 오류: {error_msg}</div>
|
| 845 |
-
</div>
|
| 846 |
-
`;
|
| 847 |
-
</script>
|
| 848 |
-
"""
|
| 849 |
-
return exception_js, {
|
| 850 |
-
"is_deployed": False,
|
| 851 |
-
"status": "error",
|
| 852 |
-
"message": error_msg,
|
| 853 |
-
"url": ""
|
| 854 |
-
}
|
| 855 |
|
| 856 |
|
| 857 |
# ------------------------
|
|
@@ -1121,10 +1067,10 @@ with gr.Blocks(css_paths=["app.css"], theme=theme) as demo:
|
|
| 1121 |
gr.HTML('<div class="help-text">💡 원하는 게임의 설명을 입력하세요. 예: "테트리스 게임 제작해줘."</div>')
|
| 1122 |
|
| 1123 |
|
| 1124 |
-
|
| 1125 |
-
|
| 1126 |
-
|
| 1127 |
-
|
| 1128 |
deploy_result_container = gr.HTML(
|
| 1129 |
"""
|
| 1130 |
<div class="deploy-section">
|
|
@@ -1134,10 +1080,9 @@ with gr.Blocks(css_paths=["app.css"], theme=theme) as demo:
|
|
| 1134 |
</div>
|
| 1135 |
</div>
|
| 1136 |
""",
|
| 1137 |
-
|
| 1138 |
)
|
| 1139 |
|
| 1140 |
-
|
| 1141 |
# 이벤트 / 콜백
|
| 1142 |
# Code Drawer
|
| 1143 |
codeBtn.click(
|
|
@@ -1208,17 +1153,19 @@ with gr.Blocks(css_paths=["app.css"], theme=theme) as demo:
|
|
| 1208 |
|
| 1209 |
|
| 1210 |
|
| 1211 |
-
|
| 1212 |
-
|
| 1213 |
-
|
|
|
|
|
|
|
|
|
|
| 1214 |
deploy_btn.click(
|
| 1215 |
-
fn=
|
| 1216 |
-
inputs=[code_output,
|
| 1217 |
-
outputs=[deploy_result_container
|
| 1218 |
)
|
| 1219 |
|
| 1220 |
|
| 1221 |
-
|
| 1222 |
# ------------------------
|
| 1223 |
# 9) 실행
|
| 1224 |
# ------------------------
|
|
|
|
| 647 |
|
| 648 |
|
| 649 |
|
| 650 |
+
####################################################
|
| 651 |
+
# 1) deploy_to_vercel 함수
|
| 652 |
+
####################################################
|
|
|
|
|
|
|
|
|
|
| 653 |
def deploy_to_vercel(code: str):
|
| 654 |
print("[DEBUG] deploy_to_vercel() 시작. code 길이:", len(code) if code else 0)
|
| 655 |
try:
|
|
|
|
| 765 |
"""
|
| 766 |
|
| 767 |
|
| 768 |
+
####################################################
|
| 769 |
+
# 2) handle_deploy_legacy: iframe으로 결과 표시
|
| 770 |
+
####################################################
|
| 771 |
+
def handle_deploy_legacy(code):
|
| 772 |
+
print("[DEBUG] handle_deploy_legacy() 호출됨. code 길이:", len(code) if code else 0)
|
| 773 |
+
if not code or len(code.strip()) < 10:
|
| 774 |
+
print("[DEBUG] 유효하지 않은 코드 (None or 너무 짧음).")
|
| 775 |
+
return "<div style='color:red;'>배포할 코드가 없습니다.</div>"
|
| 776 |
|
| 777 |
+
# remove_code_block 처리
|
| 778 |
+
clean_code = remove_code_block(code)
|
| 779 |
+
print("[DEBUG] remove_code_block 후 clean_code 길이:", len(clean_code))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 780 |
|
| 781 |
+
# 실제 배포
|
| 782 |
+
result_html = deploy_to_vercel(clean_code)
|
| 783 |
+
print("[DEBUG] 배포 결과 HTML 길이:", len(result_html))
|
|
|
|
| 784 |
|
| 785 |
+
# iframe에 표시하기 위해 Base64로 인코딩
|
| 786 |
+
encoded_html = base64.b64encode(result_html.encode('utf-8')).decode()
|
| 787 |
+
data_uri = f"data:text/html;charset=utf-8;base64,{encoded_html}"
|
|
|
|
| 788 |
|
| 789 |
+
# Gradio 3.29 이하 버전에서는 unsafe_allow_html 미지원이므로,
|
| 790 |
+
# iframe 태그만 반환하여 script 실행.
|
| 791 |
+
iframe_html = f"""
|
| 792 |
+
<iframe src="{data_uri}"
|
| 793 |
+
style="width:100%; height:600px; border:none;"
|
| 794 |
+
sandbox="allow-scripts allow-same-origin allow-popups">
|
| 795 |
+
</iframe>
|
| 796 |
+
"""
|
| 797 |
+
print("[DEBUG] iframe_html 반환")
|
| 798 |
+
return iframe_html
|
| 799 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 800 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 801 |
|
| 802 |
|
| 803 |
# ------------------------
|
|
|
|
| 1067 |
gr.HTML('<div class="help-text">💡 원하는 게임의 설명을 입력하세요. 예: "테트리스 게임 제작해줘."</div>')
|
| 1068 |
|
| 1069 |
|
| 1070 |
+
##################################################################
|
| 1071 |
+
# 3) deploy_result_container = gr.HTML() (unsafe_allow_html = False)
|
| 1072 |
+
##################################################################
|
| 1073 |
+
# unsafe_allow_html 없이도 iframe 자체는 표시됨
|
| 1074 |
deploy_result_container = gr.HTML(
|
| 1075 |
"""
|
| 1076 |
<div class="deploy-section">
|
|
|
|
| 1080 |
</div>
|
| 1081 |
</div>
|
| 1082 |
""",
|
| 1083 |
+
label="Deployment Result"
|
| 1084 |
)
|
| 1085 |
|
|
|
|
| 1086 |
# 이벤트 / 콜백
|
| 1087 |
# Code Drawer
|
| 1088 |
codeBtn.click(
|
|
|
|
| 1153 |
|
| 1154 |
|
| 1155 |
|
| 1156 |
+
|
| 1157 |
+
|
| 1158 |
+
|
| 1159 |
+
############################################################
|
| 1160 |
+
# 4) deploy_btn.click: handle_deploy_legacy를 호출
|
| 1161 |
+
############################################################
|
| 1162 |
deploy_btn.click(
|
| 1163 |
+
fn=handle_deploy_legacy,
|
| 1164 |
+
inputs=[code_output], # deploy할 code
|
| 1165 |
+
outputs=[deploy_result_container]
|
| 1166 |
)
|
| 1167 |
|
| 1168 |
|
|
|
|
| 1169 |
# ------------------------
|
| 1170 |
# 9) 실행
|
| 1171 |
# ------------------------
|