Spaces:
Paused
Paused
Update app.py
Browse files
app.py
CHANGED
|
@@ -1020,23 +1020,24 @@ with gr.Blocks(css_paths=["app.css"], theme=theme) as demo:
|
|
| 1020 |
|
| 1021 |
def deploy_to_vercel(code: str):
|
| 1022 |
try:
|
| 1023 |
-
|
|
|
|
|
|
|
|
|
|
| 1024 |
if not token:
|
| 1025 |
-
return ""
|
| 1026 |
-
|
| 1027 |
-
|
| 1028 |
-
<div class="error-icon">⚠️</div>
|
| 1029 |
-
<div class="error-message">Vercel 토큰이 설정되지 않았습니다.</div>
|
| 1030 |
-
</div>
|
| 1031 |
-
</div>
|
| 1032 |
-
"""
|
| 1033 |
-
|
| 1034 |
project_name = ''.join(random.choice(string.ascii_lowercase) for i in range(6))
|
|
|
|
|
|
|
| 1035 |
deploy_url = "https://api.vercel.com/v13/deployments"
|
| 1036 |
headers = {
|
| 1037 |
"Authorization": f"Bearer {token}",
|
| 1038 |
"Content-Type": "application/json"
|
| 1039 |
}
|
|
|
|
|
|
|
| 1040 |
package_json = {
|
| 1041 |
"name": project_name,
|
| 1042 |
"version": "1.0.0",
|
|
@@ -1048,59 +1049,53 @@ with gr.Blocks(css_paths=["app.css"], theme=theme) as demo:
|
|
| 1048 |
"preview": "vite preview"
|
| 1049 |
}
|
| 1050 |
}
|
|
|
|
|
|
|
| 1051 |
files = [
|
| 1052 |
{"file": "index.html", "data": code},
|
| 1053 |
{"file": "package.json", "data": json.dumps(package_json, indent=2)}
|
| 1054 |
]
|
|
|
|
|
|
|
| 1055 |
project_settings = {
|
| 1056 |
"buildCommand": "npm run build",
|
| 1057 |
"outputDirectory": "dist",
|
| 1058 |
"installCommand": "npm install",
|
| 1059 |
"framework": None
|
| 1060 |
}
|
|
|
|
|
|
|
| 1061 |
deploy_data = {
|
| 1062 |
"name": project_name,
|
| 1063 |
"files": files,
|
| 1064 |
"target": "production",
|
| 1065 |
"projectSettings": project_settings
|
| 1066 |
}
|
|
|
|
|
|
|
| 1067 |
deploy_response = requests.post(deploy_url, headers=headers, json=deploy_data)
|
| 1068 |
if deploy_response.status_code != 200:
|
| 1069 |
-
return f""
|
| 1070 |
-
<div class="deploy-section">
|
| 1071 |
-
<div class="deploy-error">
|
| 1072 |
-
<div class="error-icon">⚠️</div>
|
| 1073 |
-
<div class="error-message">배포 실패: {deploy_response.text}</div>
|
| 1074 |
-
</div>
|
| 1075 |
-
</div>
|
| 1076 |
-
"""
|
| 1077 |
|
|
|
|
| 1078 |
deployment_url = f"https://{project_name}.vercel.app"
|
| 1079 |
-
time.sleep(5)
|
| 1080 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1081 |
return f"""
|
| 1082 |
-
|
| 1083 |
-
|
| 1084 |
-
|
| 1085 |
-
|
| 1086 |
-
|
| 1087 |
-
|
| 1088 |
-
|
| 1089 |
-
|
| 1090 |
-
|
| 1091 |
-
</div>
|
| 1092 |
-
</div>
|
| 1093 |
-
"""
|
| 1094 |
except Exception as e:
|
| 1095 |
-
return f""
|
| 1096 |
-
<div class="deploy-section">
|
| 1097 |
-
<div class="deploy-error">
|
| 1098 |
-
<div class="error-icon">⚠️</div>
|
| 1099 |
-
<div class="error-message">배포 중 오류 발생: {str(e)}</div>
|
| 1100 |
-
</div>
|
| 1101 |
-
</div>
|
| 1102 |
-
"""
|
| 1103 |
-
|
| 1104 |
|
| 1105 |
|
| 1106 |
# handle_deploy
|
|
@@ -1204,21 +1199,12 @@ with gr.Blocks(css_paths=["app.css"], theme=theme) as demo:
|
|
| 1204 |
"url": ""
|
| 1205 |
}
|
| 1206 |
|
| 1207 |
-
|
| 1208 |
-
|
| 1209 |
deploy_btn.click(
|
| 1210 |
-
fn=lambda code: deploy_to_vercel(remove_code_block(code))
|
| 1211 |
-
<div class="deploy-section">
|
| 1212 |
-
<div class="deploy-error">
|
| 1213 |
-
<div class="error-icon">⚠️</div>
|
| 1214 |
-
<div class="error-message">배포할 코드가 없습니다. 먼저 게임 코드를 생성해주세요.</div>
|
| 1215 |
-
</div>
|
| 1216 |
-
</div>
|
| 1217 |
-
""",
|
| 1218 |
inputs=[code_output],
|
| 1219 |
outputs=[deploy_result_container]
|
| 1220 |
-
|
| 1221 |
-
|
| 1222 |
# ------------------------
|
| 1223 |
# 8) 실제 실행
|
| 1224 |
# ------------------------
|
|
|
|
| 1020 |
|
| 1021 |
def deploy_to_vercel(code: str):
|
| 1022 |
try:
|
| 1023 |
+
if not code or len(code.strip()) < 10:
|
| 1024 |
+
return "<div style='color:red; padding:10px; border:1px solid red; border-radius:5px;'>배포할 코드가 없습니다. 먼저 게임 코드를 생성해주세요.</div>"
|
| 1025 |
+
|
| 1026 |
+
token = "A8IFZmgW2cqA4yUNlLPnci0N"
|
| 1027 |
if not token:
|
| 1028 |
+
return "<div style='color:red; padding:10px; border:1px solid red; border-radius:5px;'>Vercel 토큰이 설정되지 않았습니다.</div>"
|
| 1029 |
+
|
| 1030 |
+
# 프로젝트 이름 생성
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1031 |
project_name = ''.join(random.choice(string.ascii_lowercase) for i in range(6))
|
| 1032 |
+
|
| 1033 |
+
# Vercel API 요청 준비
|
| 1034 |
deploy_url = "https://api.vercel.com/v13/deployments"
|
| 1035 |
headers = {
|
| 1036 |
"Authorization": f"Bearer {token}",
|
| 1037 |
"Content-Type": "application/json"
|
| 1038 |
}
|
| 1039 |
+
|
| 1040 |
+
# 패키지 정보
|
| 1041 |
package_json = {
|
| 1042 |
"name": project_name,
|
| 1043 |
"version": "1.0.0",
|
|
|
|
| 1049 |
"preview": "vite preview"
|
| 1050 |
}
|
| 1051 |
}
|
| 1052 |
+
|
| 1053 |
+
# 배포할 파일들
|
| 1054 |
files = [
|
| 1055 |
{"file": "index.html", "data": code},
|
| 1056 |
{"file": "package.json", "data": json.dumps(package_json, indent=2)}
|
| 1057 |
]
|
| 1058 |
+
|
| 1059 |
+
# 프로젝트 설정
|
| 1060 |
project_settings = {
|
| 1061 |
"buildCommand": "npm run build",
|
| 1062 |
"outputDirectory": "dist",
|
| 1063 |
"installCommand": "npm install",
|
| 1064 |
"framework": None
|
| 1065 |
}
|
| 1066 |
+
|
| 1067 |
+
# 배포 데이터
|
| 1068 |
deploy_data = {
|
| 1069 |
"name": project_name,
|
| 1070 |
"files": files,
|
| 1071 |
"target": "production",
|
| 1072 |
"projectSettings": project_settings
|
| 1073 |
}
|
| 1074 |
+
|
| 1075 |
+
# API 요청 및 응답 처리
|
| 1076 |
deploy_response = requests.post(deploy_url, headers=headers, json=deploy_data)
|
| 1077 |
if deploy_response.status_code != 200:
|
| 1078 |
+
return f"<div style='color:red; padding:10px; border:1px solid red; border-radius:5px;'>배포 실패: {deploy_response.text}</div>"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1079 |
|
| 1080 |
+
# 배포 URL 생성
|
| 1081 |
deployment_url = f"https://{project_name}.vercel.app"
|
|
|
|
| 1082 |
|
| 1083 |
+
# 배포 완료 기다리기
|
| 1084 |
+
time.sleep(3)
|
| 1085 |
+
|
| 1086 |
+
# 결과 반환
|
| 1087 |
return f"""
|
| 1088 |
+
<div style='padding: 15px; background-color: #f0fff4; border: 1px solid #34c759; border-radius: 8px;'>
|
| 1089 |
+
<h3 style='margin-top: 0; color: #34c759;'>✅ 배포 완료!</h3>
|
| 1090 |
+
<p>게임이 성공적으로 배포되었습니다.</p>
|
| 1091 |
+
<div style='margin-top: 10px; padding: 10px; background: #f8fafc; border-radius: 6px; display: flex; justify-content: space-between; align-items: center;'>
|
| 1092 |
+
<a href="{deployment_url}" target="_blank" style='color: #0066cc; text-decoration: none; word-break: break-all;'>{deployment_url}</a>
|
| 1093 |
+
<button onclick="navigator.clipboard.writeText('{deployment_url}')" style='background: #0066cc; color: white; border: none; border-radius: 4px; padding: 5px 10px; cursor: pointer;'>복사</button>
|
| 1094 |
+
</div>
|
| 1095 |
+
</div>
|
| 1096 |
+
"""
|
|
|
|
|
|
|
|
|
|
| 1097 |
except Exception as e:
|
| 1098 |
+
return f"<div style='color:red; padding:10px; border:1px solid red; border-radius:5px;'>오류 발생: {str(e)}</div>"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1099 |
|
| 1100 |
|
| 1101 |
# handle_deploy
|
|
|
|
| 1199 |
"url": ""
|
| 1200 |
}
|
| 1201 |
|
| 1202 |
+
# deploy_btn.click 함수를 찾아 다음으로 완전히 교체하세요
|
|
|
|
| 1203 |
deploy_btn.click(
|
| 1204 |
+
fn=lambda code: deploy_to_vercel(remove_code_block(code)),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1205 |
inputs=[code_output],
|
| 1206 |
outputs=[deploy_result_container]
|
| 1207 |
+
)
|
|
|
|
| 1208 |
# ------------------------
|
| 1209 |
# 8) 실제 실행
|
| 1210 |
# ------------------------
|