openfree commited on
Commit
2f9dd35
·
verified ·
1 Parent(s): ff01f60

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +134 -371
app.py CHANGED
@@ -667,186 +667,19 @@ with gr.Blocks(css_paths=["app.css"], theme=theme) as demo:
667
  <h1>🎮 Vibe Game Craft</h1>
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>
681
- <button onclick="copyBannerUrl()" class="deploy-banner-copy-btn">복사</button>
682
  </div>
683
  </div>
684
  </div>
685
-
686
- <style>
687
- /* 전체 앱 스타일 */
688
- :root {
689
- --primary-color: #9c89b8;
690
- --secondary-color: #f0a6ca;
691
- --accent-color: #b8bedd;
692
- --background-color: #f9f7fd;
693
- --panel-color: #ffffff;
694
- --text-color: #3a3042;
695
- --button-hover: #efc3e6;
696
- --shadow: 0 4px 6px rgba(50, 50, 93, 0.11), 0 1px 3px rgba(0, 0, 0, 0.08);
697
- --radius: 12px;
698
- }
699
-
700
- body {
701
- background-color: var(--background-color);
702
- color: var(--text-color);
703
- font-family: 'Poppins', sans-serif;
704
- }
705
-
706
- /* 헤더 스타일 */
707
- .app-header {
708
- text-align: center;
709
- padding: 1.5rem 1rem;
710
- margin-bottom: 0.5rem;
711
- background: linear-gradient(to right, var(--primary-color), var(--secondary-color));
712
- border-radius: var(--radius);
713
- box-shadow: var(--shadow);
714
- color: white;
715
- }
716
-
717
- .app-header h1 {
718
- font-size: 2.5rem;
719
- font-weight: 700;
720
- margin-bottom: 0.5rem;
721
- text-shadow: 0 2px 4px rgba(0,0,0,0.1);
722
- }
723
-
724
- .app-header p {
725
- font-size: 1.1rem;
726
- opacity: 0.9;
727
- max-width: 800px;
728
- margin: 0 auto;
729
- }
730
-
731
- /* 배포 배너 스타일 - 헤더 바로 아래에 표시 */
732
- .deploy-banner {
733
- background: white;
734
- border-radius: var(--radius);
735
- margin: 0.5rem auto 1.5rem auto;
736
- box-shadow: var(--shadow);
737
- max-width: 1200px;
738
- border: 1px solid #ddd;
739
- overflow: hidden;
740
- transition: all 0.3s ease;
741
- }
742
-
743
- .deploy-banner.success {
744
- border-left: 5px solid #34c759;
745
- }
746
-
747
- .deploy-banner.error {
748
- border-left: 5px solid #ff3b30;
749
- }
750
-
751
- .deploy-banner.loading {
752
- border-left: 5px solid #007aff;
753
- }
754
-
755
- .deploy-banner-content {
756
- display: flex;
757
- align-items: center;
758
- padding: 15px 20px;
759
- }
760
-
761
- .deploy-banner-icon {
762
- font-size: 24px;
763
- margin-right: 15px;
764
- }
765
-
766
- .deploy-banner-info {
767
- flex: 1;
768
- }
769
-
770
- .deploy-banner-title {
771
- font-weight: bold;
772
- font-size: 16px;
773
- margin-bottom: 5px;
774
- }
775
-
776
- .deploy-banner-message {
777
- color: #666;
778
- }
779
-
780
- .deploy-banner-url-container {
781
- background: #f5f8ff;
782
- padding: 10px 15px;
783
- border-radius: 8px;
784
- margin-left: 20px;
785
- max-width: 400px;
786
- display: flex;
787
- align-items: center;
788
- }
789
-
790
- .deploy-banner-url {
791
- color: #0066cc;
792
- text-decoration: none;
793
- font-weight: 500;
794
- word-break: break-all;
795
- flex: 1;
796
- }
797
-
798
- .deploy-banner-copy-btn {
799
- background: #0066cc;
800
- color: white;
801
- border: none;
802
- border-radius: 4px;
803
- padding: 5px 10px;
804
- margin-left: 10px;
805
- cursor: pointer;
806
- font-size: 12px;
807
- }
808
-
809
- .deploy-banner-copy-btn:hover {
810
- background: #0052a3;
811
- }
812
- </style>
813
-
814
- <script>
815
- // URL 복사 함수
816
- function copyBannerUrl() {
817
- const url = document.getElementById('deploy-banner-url').href;
818
- navigator.clipboard.writeText(url)
819
- .then(() => {
820
- const copyBtn = document.querySelector('.deploy-banner-copy-btn');
821
- const originalText = copyBtn.textContent;
822
- copyBtn.textContent = '복사됨!';
823
- setTimeout(() => {
824
- copyBtn.textContent = originalText;
825
- }, 1000);
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');
834
- const bannerUrlContainer = document.getElementById('deploy-banner-url-container');
835
- const bannerUrl = document.getElementById('deploy-banner-url');
836
-
837
- banner.className = 'deploy-banner ' + type;
838
- bannerTitle.textContent = title;
839
- bannerMessage.textContent = message;
840
-
841
- if (url) {
842
- bannerUrl.href = url;
843
- bannerUrl.textContent = url;
844
- bannerUrlContainer.style.display = 'flex';
845
- } else {
846
- bannerUrlContainer.style.display = 'none';
847
- }
848
- }
849
- </script>
850
  """)
851
 
852
  history = gr.State([])
@@ -939,7 +772,7 @@ with gr.Blocks(css_paths=["app.css"], theme=theme) as demo:
939
  """
940
  <div class="deploy-section">
941
  <div class="deploy-header">📤 배포 결과</div>
942
- <div id="deploy-result-box" class="deploy-result-box">
943
  <div class="no-deploy">아직 배포된 게임이 없습니다.</div>
944
  </div>
945
  </div>
@@ -1017,63 +850,7 @@ with gr.Blocks(css_paths=["app.css"], theme=theme) as demo:
1017
  outputs=[sandbox, state_tab]
1018
  )
1019
 
1020
- # 실제 배포 로직
1021
- def deploy_to_vercel(code: str):
1022
- try:
1023
- token = "A8IFZmgW2cqA4yUNlLPnci0N" # 실제 토큰 필요
1024
- if not token:
1025
- return {"status": "error", "message": "Vercel 토큰이 설정되지 않았습니다."}
1026
-
1027
- project_name = ''.join(random.choice(string.ascii_lowercase) for i in range(6))
1028
- deploy_url = "https://api.vercel.com/v13/deployments"
1029
- headers = {
1030
- "Authorization": f"Bearer {token}",
1031
- "Content-Type": "application/json"
1032
- }
1033
- package_json = {
1034
- "name": project_name,
1035
- "version": "1.0.0",
1036
- "private": True,
1037
- "dependencies": {"vite": "^5.0.0"},
1038
- "scripts": {
1039
- "dev": "vite",
1040
- "build": "echo 'No build needed' && mkdir -p dist && cp index.html dist/",
1041
- "preview": "vite preview"
1042
- }
1043
- }
1044
- files = [
1045
- {"file": "index.html", "data": code},
1046
- {"file": "package.json", "data": json.dumps(package_json, indent=2)}
1047
- ]
1048
- project_settings = {
1049
- "buildCommand": "npm run build",
1050
- "outputDirectory": "dist",
1051
- "installCommand": "npm install",
1052
- "framework": None
1053
- }
1054
- deploy_data = {
1055
- "name": project_name,
1056
- "files": files,
1057
- "target": "production",
1058
- "projectSettings": project_settings
1059
- }
1060
- deploy_response = requests.post(deploy_url, headers=headers, json=deploy_data)
1061
- if deploy_response.status_code != 200:
1062
- return {"status": "error", "message": f"배포 실패: {deploy_response.text}"}
1063
-
1064
- deployment_url = f"https://{project_name}.vercel.app"
1065
- time.sleep(5)
1066
-
1067
- return {
1068
- "status": "success",
1069
- "url": deployment_url,
1070
- "project_name": project_name
1071
- }
1072
- except Exception as e:
1073
- return {"status": "error", "message": f"배포 중 오류 발생: {str(e)}"}
1074
-
1075
-
1076
- # 이 함수만 교체하세요
1077
  def handle_deploy(code, deploy_status):
1078
  if not code:
1079
  banner_html = """
@@ -1088,184 +865,170 @@ with gr.Blocks(css_paths=["app.css"], theme=theme) as demo:
1088
  </div>
1089
  """
1090
  result_html = """
1091
- <div class="deploy-section">
1092
- <div class="deploy-header">📤 배포 결과</div>
1093
- <div class="deploy-result-box">
1094
- <div class="deploy-error">
1095
- <div class="error-icon">⚠️</div>
1096
- <div class="error-message">배포할 코드가 없습니다.</div>
1097
- </div>
1098
- </div>
1099
- </div>
1100
- """
1101
- return banner_html, result_html, {
1102
- "is_deployed": False,
1103
- "status": "error",
1104
- "message": "배포할 코드가 없습니다.",
1105
- "url": ""
1106
- }
1107
-
1108
  try:
1109
- # 로딩 상태 표시
1110
  banner_loading_html = """
1111
- <div class="deploy-banner loading">
1112
- <div class="deploy-banner-content">
1113
- <div class="deploy-banner-icon">🔄</div>
1114
- <div class="deploy-banner-info">
1115
- <div class="deploy-banner-title">배포 진행 중</div>
1116
- <div class="deploy-banner-message">Vercel에 게임을 배포하고 있습니다. 잠시만 기다려주세요.</div>
1117
- </div>
1118
- </div>
1119
- </div>
1120
- """
1121
  result_loading_html = """
1122
- <div class="deploy-section">
1123
- <div class="deploy-header">📤 배포 결과</div>
1124
- <div class="deploy-result-box">
1125
- <div class="deploy-loading">
1126
- <div class="loading-spinner"></div>
1127
- <div class="loading-message">Vercel에 배포 중입니다...</div>
1128
- </div>
1129
- </div>
1130
- </div>
1131
- """
 
 
1132
  yield banner_loading_html, result_loading_html, deploy_status
1133
-
 
1134
  clean_code = remove_code_block(code)
1135
  result = deploy_to_vercel(clean_code)
1136
-
 
1137
  if result.get("status") == "success":
1138
  url = result.get("url")
1139
  banner_success_html = f"""
1140
- <div class="deploy-banner success">
1141
- <div class="deploy-banner-content">
1142
- <div class="deploy-banner-icon">✅</div>
1143
- <div class="deploy-banner-info">
1144
- <div class="deploy-banner-title">배포 완료!</div>
1145
- <div class="deploy-banner-message">게임이 성공적으로 Vercel에 배포되었습니다.</div>
1146
- </div>
1147
- <div class="deploy-banner-url-container">
1148
- <a href="{url}" target="_blank" class="deploy-banner-url">{url}</a>
1149
- <button onclick="navigator.clipboard.writeText('{url}')" class="deploy-banner-copy-btn">복사</button>
1150
- </div>
1151
- </div>
1152
- </div>
1153
- """
1154
-
1155
  result_success_html = f"""
1156
- <div class="deploy-section">
1157
- <div class="deploy-header">📤 배포 결과</div>
1158
- <div class="deploy-result-box">
1159
- <div class="deploy-success">
1160
- <div class="success-icon">✅</div>
1161
- <div class="success-message">배포 완료!</div>
1162
- <div class="url-box">
1163
- <a href="{url}" target="_blank">{url}</a>
1164
- <button class="copy-btn" onclick="navigator.clipboard.writeText('{url}')">복사</button>
 
 
 
1165
  </div>
1166
- </div>
1167
- </div>
1168
- </div>
1169
- """
1170
-
1171
- return banner_success_html, result_success_html, {
1172
  "is_deployed": True,
1173
  "status": "success",
1174
  "url": url,
1175
  "message": "배포 완료!"
1176
  }
 
 
 
 
1177
  else:
1178
  error_msg = result.get("message", "알 수 없는 오류")
1179
  banner_error_html = f"""
1180
- <div class="deploy-banner error">
1181
- <div class="deploy-banner-content">
1182
- <div class="deploy-banner-icon">⚠️</div>
1183
- <div class="deploy-banner-info">
1184
- <div class="deploy-banner-title">배포 실패</div>
1185
- <div class="deploy-banner-message">{error_msg}</div>
1186
- </div>
1187
- </div>
1188
- </div>
1189
- """
1190
-
1191
  result_error_html = f"""
1192
- <div class="deploy-section">
1193
- <div class="deploy-header">📤 배포 결과</div>
1194
- <div class="deploy-result-box">
1195
- <div class="deploy-error">
1196
- <div class="error-icon">⚠️</div>
1197
- <div class="error-message">배포 실패: {error_msg}</div>
1198
- </div>
1199
- </div>
1200
- </div>
1201
- """
1202
-
1203
- return banner_error_html, result_error_html, {
1204
  "is_deployed": False,
1205
  "status": "error",
1206
  "message": error_msg,
1207
  "url": ""
1208
  }
1209
-
 
 
1210
  except Exception as e:
1211
  error_msg = str(e)
1212
  banner_exception_html = f"""
1213
- <div class="deploy-banner error">
1214
- <div class="deploy-banner-content">
1215
- <div class="deploy-banner-icon">⚠️</div>
1216
- <div class="deploy-banner-info">
1217
- <div class="deploy-banner-title">시스템 오류</div>
1218
- <div class="deploy-banner-message">{error_msg}</div>
1219
- </div>
1220
- </div>
1221
- </div>
1222
- """
1223
-
1224
  result_exception_html = f"""
1225
- <div class="deploy-section">
1226
- <div class="deploy-header">📤 배포 결과</div>
1227
- <div class="deploy-result-box">
1228
- <div class="deploy-error">
1229
- <div class="error-icon">⚠️</div>
1230
- <div class="error-message">시스템 오류: {error_msg}</div>
1231
- </div>
1232
- </div>
1233
- </div>
1234
- """
1235
-
1236
- return banner_exception_html, result_exception_html, {
1237
  "is_deployed": False,
1238
  "status": "error",
1239
  "message": error_msg,
1240
  "url": ""
1241
  }
 
 
1242
 
1243
-
1244
- # 헤더 HTML 추가 (기존 헤더 HTML 대신 사용)
1245
- header_banner = gr.HTML("""
1246
- <div class="app-header">
1247
- <h1>🎮 Vibe Game Craft</h1>
1248
- <p>설명을 입력하면 웹 기반 HTML5, JavaScript, CSS 게임을 생성합니다. 직관적인 인터페이스로 쉽게 게임을 만들고, 실시간으로 미리보기를 확인하세요.</p>
1249
- </div>
1250
- """)
1251
-
1252
- deploy_banner = gr.HTML("""
1253
- <div class="deploy-banner">
1254
- <div class="deploy-banner-content">
1255
- <div class="deploy-banner-icon">🚀</div>
1256
- <div class="deploy-banner-info">
1257
- <div class="deploy-banner-title">배포 준비됨</div>
1258
- <div class="deploy-banner-message">배포 버튼을 클릭하여 게임을 배포하세요.</div>
1259
- </div>
1260
- </div>
1261
- </div>
1262
- """)
1263
-
1264
- # 배포 버튼 클릭 - 이 부분을 변경하세요
1265
  deploy_btn.click(
1266
  fn=handle_deploy,
1267
  inputs=[code_output, deploy_status],
1268
- outputs=[header_html, deploy_result_container, deploy_status]
1269
  )
1270
 
1271
  if __name__ == "__main__":
 
667
  <h1>🎮 Vibe Game Craft</h1>
668
  <p>설명을 입력하면 웹 기반 HTML5, JavaScript, CSS 게임을 생성합니다. 직관적인 인터페이스로 쉽게 게임을 만들고, 실시간으로 미리보기를 확인하세요.</p>
669
  </div>
670
+ """)
671
 
672
+ # 배포 결과 배너 - 별도 컴포넌트로 추가
673
+ deploy_banner = gr.HTML("""
674
+ <div class="deploy-banner">
675
  <div class="deploy-banner-content">
676
  <div class="deploy-banner-icon">🚀</div>
677
  <div class="deploy-banner-info">
678
+ <div class="deploy-banner-title">배포 준비됨</div>
679
+ <div class="deploy-banner-message">배포 버튼을 클릭하여 게임을 배포하세요.</div>
 
 
 
 
680
  </div>
681
  </div>
682
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
683
  """)
684
 
685
  history = gr.State([])
 
772
  """
773
  <div class="deploy-section">
774
  <div class="deploy-header">📤 배포 결과</div>
775
+ <div class="deploy-result-box">
776
  <div class="no-deploy">아직 배포된 게임이 없습니다.</div>
777
  </div>
778
  </div>
 
850
  outputs=[sandbox, state_tab]
851
  )
852
 
853
+ # 배포 함수
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
854
  def handle_deploy(code, deploy_status):
855
  if not code:
856
  banner_html = """
 
865
  </div>
866
  """
867
  result_html = """
868
+ <div class="deploy-section">
869
+ <div class="deploy-header">📤 배포 결과</div>
870
+ <div class="deploy-result-box">
871
+ <div class="deploy-error">
872
+ <div class="error-icon">⚠️</div>
873
+ <div class="error-message">배포할 코드가 없습니다.</div>
874
+ </div>
875
+ </div>
876
+ </div>
877
+ """
878
+ return banner_html, result_html, deploy_status
879
+
 
 
 
 
 
880
  try:
881
+ # 로딩 상태 표시
882
  banner_loading_html = """
883
+ <div class="deploy-banner loading">
884
+ <div class="deploy-banner-content">
885
+ <div class="deploy-banner-icon">🔄</div>
886
+ <div class="deploy-banner-info">
887
+ <div class="deploy-banner-title">배포 진행 중</div>
888
+ <div class="deploy-banner-message">Vercel에 게임을 배포하고 있습니다. 잠시만 기다려주세요.</div>
889
+ </div>
890
+ </div>
891
+ </div>
892
+ """
893
  result_loading_html = """
894
+ <div class="deploy-section">
895
+ <div class="deploy-header">📤 배포 결과</div>
896
+ <div class="deploy-result-box">
897
+ <div class="deploy-loading">
898
+ <div class="loading-spinner"></div>
899
+ <div class="loading-message">Vercel에 배포 중입니다...</div>
900
+ </div>
901
+ </div>
902
+ </div>
903
+ """
904
+
905
+ # 로딩 상태 반환
906
  yield banner_loading_html, result_loading_html, deploy_status
907
+
908
+ # 실제 배포 처리
909
  clean_code = remove_code_block(code)
910
  result = deploy_to_vercel(clean_code)
911
+
912
+ # 배포 성공
913
  if result.get("status") == "success":
914
  url = result.get("url")
915
  banner_success_html = f"""
916
+ <div class="deploy-banner success">
917
+ <div class="deploy-banner-content">
918
+ <div class="deploy-banner-icon">✅</div>
919
+ <div class="deploy-banner-info">
920
+ <div class="deploy-banner-title">배포 완료!</div>
921
+ <div class="deploy-banner-message">게임이 성공적으로 Vercel에 배포되었습니다.</div>
922
+ </div>
923
+ <div class="deploy-banner-url-container" style="display:flex;">
924
+ <a href="{url}" target="_blank" class="deploy-banner-url">{url}</a>
925
+ <button onclick="navigator.clipboard.writeText('{url}')" class="deploy-banner-copy-btn">복사</button>
926
+ </div>
927
+ </div>
928
+ </div>
929
+ """
930
+
931
  result_success_html = f"""
932
+ <div class="deploy-section">
933
+ <div class="deploy-header">📤 배포 결과</div>
934
+ <div class="deploy-result-box">
935
+ <div class="deploy-success">
936
+ <div class="success-icon">✅</div>
937
+ <div class="success-message">배포 완료!</div>
938
+ <div class="url-box">
939
+ <a href="{url}" target="_blank">{url}</a>
940
+ <button class="copy-btn" onclick="navigator.clipboard.writeText('{url}')">복사</button>
941
+ </div>
942
+ </div>
943
+ </div>
944
  </div>
945
+ """
946
+
947
+ updated_status = {
 
 
 
948
  "is_deployed": True,
949
  "status": "success",
950
  "url": url,
951
  "message": "배포 완료!"
952
  }
953
+
954
+ return banner_success_html, result_success_html, updated_status
955
+
956
+ # 배포 실패
957
  else:
958
  error_msg = result.get("message", "알 수 없는 오류")
959
  banner_error_html = f"""
960
+ <div class="deploy-banner error">
961
+ <div class="deploy-banner-content">
962
+ <div class="deploy-banner-icon">⚠️</div>
963
+ <div class="deploy-banner-info">
964
+ <div class="deploy-banner-title">배포 실패</div>
965
+ <div class="deploy-banner-message">{error_msg}</div>
966
+ </div>
967
+ </div>
968
+ </div>
969
+ """
970
+
971
  result_error_html = f"""
972
+ <div class="deploy-section">
973
+ <div class="deploy-header">📤 배포 결과</div>
974
+ <div class="deploy-result-box">
975
+ <div class="deploy-error">
976
+ <div class="error-icon">⚠️</div>
977
+ <div class="error-message">배포 실패: {error_msg}</div>
978
+ </div>
979
+ </div>
980
+ </div>
981
+ """
982
+
983
+ updated_status = {
984
  "is_deployed": False,
985
  "status": "error",
986
  "message": error_msg,
987
  "url": ""
988
  }
989
+
990
+ return banner_error_html, result_error_html, updated_status
991
+
992
  except Exception as e:
993
  error_msg = str(e)
994
  banner_exception_html = f"""
995
+ <div class="deploy-banner error">
996
+ <div class="deploy-banner-content">
997
+ <div class="deploy-banner-icon">⚠️</div>
998
+ <div class="deploy-banner-info">
999
+ <div class="deploy-banner-title">시스템 오류</div>
1000
+ <div class="deploy-banner-message">{error_msg}</div>
1001
+ </div>
1002
+ </div>
1003
+ </div>
1004
+ """
1005
+
1006
  result_exception_html = f"""
1007
+ <div class="deploy-section">
1008
+ <div class="deploy-header">📤 배포 결과</div>
1009
+ <div class="deploy-result-box">
1010
+ <div class="deploy-error">
1011
+ <div class="error-icon">⚠️</div>
1012
+ <div class="error-message">시스템 오류: {error_msg}</div>
1013
+ </div>
1014
+ </div>
1015
+ </div>
1016
+ """
1017
+
1018
+ updated_status = {
1019
  "is_deployed": False,
1020
  "status": "error",
1021
  "message": error_msg,
1022
  "url": ""
1023
  }
1024
+
1025
+ return banner_exception_html, result_exception_html, updated_status
1026
 
1027
+ # 배포 버튼 클릭 - 수정된 부분
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1028
  deploy_btn.click(
1029
  fn=handle_deploy,
1030
  inputs=[code_output, deploy_status],
1031
+ outputs=[deploy_banner, deploy_result_container, deploy_status]
1032
  )
1033
 
1034
  if __name__ == "__main__":