openfree commited on
Commit
eb864b6
·
verified ·
1 Parent(s): e28f123

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +44 -97
app.py CHANGED
@@ -647,12 +647,9 @@ class Demo:
647
 
648
 
649
 
650
- # ------------------------
651
- # 7) 실제 배포 함수를 수정하여 화면 표시
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) handle_deploy 함수 (로깅 + 반환 HTML)
773
- ###############################################
774
- def handle_deploy(code, deploy_status):
775
- print("[DEBUG] handle_deploy() 함수가 호출되었습니다.")
776
- print("[DEBUG] 전달된 code:", repr(code[:300] if code else code))
 
 
777
 
778
- if not code:
779
- js_code = """
780
- <script>
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
- try:
800
- print("[DEBUG] 배포 로딩 상태 HTML 생성 중...")
801
- clean_code = remove_code_block(code)
802
- print("[DEBUG] remove_code_block 후 clean_code 길이:", len(clean_code))
803
 
804
- print("[DEBUG] deploy_to_vercel() 호출 시작")
805
- result_html = deploy_to_vercel(clean_code)
806
- print("[DEBUG] deploy_to_vercel() 결과 수신:")
807
- print(result_html[:500], "..." if len(result_html) > 500 else "")
808
 
809
- debug_injection = """
810
- <script>
811
- console.log('[DEBUG] 배포 후 결과 HTML:', %s);
812
- </script>
813
- """ % (json.dumps(result_html[:300]) if len(result_html) > 300 else json.dumps(result_html))
 
 
 
 
 
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
- # 3) deploy_result = gr.HTML(unsafe_allow_html=True)
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
- unsafe_allow_html=True # <--- 핵심: 스크립트 실행 허용
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
- # 4) deploy_btn 클릭 이벤트
1213
- #################################################
 
 
 
1214
  deploy_btn.click(
1215
- fn=handle_deploy,
1216
- inputs=[code_output, deploy_status],
1217
- outputs=[deploy_result_container, deploy_status]
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
  # ------------------------