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 |
# ------------------------
|