Spaces:
Sleeping
Sleeping
fix
Browse files
app.py
CHANGED
|
@@ -7,7 +7,7 @@ import time
|
|
| 7 |
# 전역 변수로 서버 URL 저장
|
| 8 |
SERVER_URL = ""
|
| 9 |
# 타임아웃 설정 (초)
|
| 10 |
-
REQUEST_TIMEOUT =
|
| 11 |
|
| 12 |
# 영구적인 HTTP 세션 생성
|
| 13 |
session = requests.Session()
|
|
@@ -16,13 +16,13 @@ adapter = requests.adapters.HTTPAdapter(
|
|
| 16 |
pool_connections=5,
|
| 17 |
pool_maxsize=10,
|
| 18 |
max_retries=requests.adapters.Retry(
|
| 19 |
-
total=
|
| 20 |
backoff_factor=0.5, # 재시도 간 대기 시간 증가 계수
|
| 21 |
status_forcelist=[429, 500, 502, 503, 504], # 재시도할 HTTP 상태 코드
|
| 22 |
allowed_methods=["GET", "POST"], # 재시도할 HTTP 메서드
|
| 23 |
-
connect=
|
| 24 |
-
read=
|
| 25 |
-
redirect=
|
| 26 |
)
|
| 27 |
)
|
| 28 |
session.mount('http://', adapter)
|
|
@@ -294,16 +294,13 @@ def get_programs():
|
|
| 294 |
if not SERVER_URL:
|
| 295 |
return "서버 URL이 설정되지 않았습니다. 먼저 서버에 연결하세요.", []
|
| 296 |
|
| 297 |
-
# 디버그 정보 기록
|
| 298 |
-
print(f"
|
| 299 |
-
|
| 300 |
-
# 로딩 메시지
|
| 301 |
-
loading_html = "<div style='text-align: center; padding: 20px;'>"
|
| 302 |
-
loading_html += f"<p>프로그램 목록을 불러오는 중입니다...</p>"
|
| 303 |
-
loading_html += f"<p>이 작업은 최대 {REQUEST_TIMEOUT}초가 소요될 수 있습니다.</p>"
|
| 304 |
-
loading_html += "</div>"
|
| 305 |
|
| 306 |
try:
|
|
|
|
|
|
|
|
|
|
| 307 |
# 헤더 추가
|
| 308 |
headers = {
|
| 309 |
"User-Agent": "LocalPCAgent-Client/1.0",
|
|
@@ -312,12 +309,39 @@ def get_programs():
|
|
| 312 |
"Connection": "keep-alive"
|
| 313 |
}
|
| 314 |
|
| 315 |
-
#
|
| 316 |
-
|
| 317 |
-
|
| 318 |
-
|
| 319 |
-
|
| 320 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 321 |
|
| 322 |
if response.status_code == 200:
|
| 323 |
result_json = response.json()
|
|
@@ -576,16 +600,21 @@ with gr.Blocks(title="LocalPCAgent 제어 인터페이스") as demo:
|
|
| 576 |
outputs=[device_info_result]
|
| 577 |
)
|
| 578 |
|
| 579 |
-
# 프로그램 실행 이벤트
|
| 580 |
get_programs_btn.click(
|
| 581 |
fn=get_programs,
|
| 582 |
inputs=None,
|
| 583 |
outputs=[programs_result, program_dropdown]
|
| 584 |
)
|
| 585 |
|
| 586 |
-
#
|
| 587 |
program_dropdown.change(
|
| 588 |
-
fn=lambda x: print(f"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 589 |
inputs=[program_dropdown],
|
| 590 |
outputs=[execute_result]
|
| 591 |
)
|
|
@@ -598,7 +627,10 @@ with gr.Blocks(title="LocalPCAgent 제어 인터페이스") as demo:
|
|
| 598 |
|
| 599 |
# 앱 실행
|
| 600 |
if __name__ == "__main__":
|
| 601 |
-
print("
|
|
|
|
|
|
|
|
|
|
| 602 |
# 디버그 모드로 실행하여 오류 추적이 쉽도록 함
|
| 603 |
demo.launch(debug=True, show_error=True) # 디버그 모드로 문제 원인 파악을 용이하게 함
|
| 604 |
-
print("
|
|
|
|
| 7 |
# 전역 변수로 서버 URL 저장
|
| 8 |
SERVER_URL = ""
|
| 9 |
# 타임아웃 설정 (초)
|
| 10 |
+
REQUEST_TIMEOUT = 15 # 더 많은 시간으로 설정하면 오히려 프로세스가 걸릴 수 있음
|
| 11 |
|
| 12 |
# 영구적인 HTTP 세션 생성
|
| 13 |
session = requests.Session()
|
|
|
|
| 16 |
pool_connections=5,
|
| 17 |
pool_maxsize=10,
|
| 18 |
max_retries=requests.adapters.Retry(
|
| 19 |
+
total=3, # 총 재시도 횟수
|
| 20 |
backoff_factor=0.5, # 재시도 간 대기 시간 증가 계수
|
| 21 |
status_forcelist=[429, 500, 502, 503, 504], # 재시도할 HTTP 상태 코드
|
| 22 |
allowed_methods=["GET", "POST"], # 재시도할 HTTP 메서드
|
| 23 |
+
connect=3, # 연결 오류에 대한 재시도 횟수
|
| 24 |
+
read=3, # 읽기 오류에 대한 재시도 횟수
|
| 25 |
+
redirect=3 # 리다이렉트 재시도 횟수
|
| 26 |
)
|
| 27 |
)
|
| 28 |
session.mount('http://', adapter)
|
|
|
|
| 294 |
if not SERVER_URL:
|
| 295 |
return "서버 URL이 설정되지 않았습니다. 먼저 서버에 연결하세요.", []
|
| 296 |
|
| 297 |
+
# 디버그 정보 기록 - 여기서 모든 오류 상황을 축적해보자
|
| 298 |
+
print(f"[DEBUG] 시작: 프로그램 목록 조회 시도 - {SERVER_URL}/api/programs")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 299 |
|
| 300 |
try:
|
| 301 |
+
# 임시 테스트 - 응답을 시뮬레이션해보자
|
| 302 |
+
print(f"[DEBUG] 헤더 구성 및 요청 준비 중")
|
| 303 |
+
|
| 304 |
# 헤더 추가
|
| 305 |
headers = {
|
| 306 |
"User-Agent": "LocalPCAgent-Client/1.0",
|
|
|
|
| 309 |
"Connection": "keep-alive"
|
| 310 |
}
|
| 311 |
|
| 312 |
+
# 드롭다운 배열 설정 오류 테스트
|
| 313 |
+
test_programs = [
|
| 314 |
+
{"id": "test1", "name": "테스트 프로그램 1", "description": "테스트 설명 1", "path": "C:\\test\\program1.exe"},
|
| 315 |
+
{"id": "test2", "name": "테스트 프로그램 2", "description": "테스트 설명 2", "path": "C:\\test\\program2.exe"}
|
| 316 |
+
]
|
| 317 |
+
|
| 318 |
+
# 코드 실행 로깅
|
| 319 |
+
print(f"[DEBUG] 테스트 데이터 생성 완료")
|
| 320 |
+
|
| 321 |
+
# 프로그램 목록을 바로 만들기
|
| 322 |
+
program_options = []
|
| 323 |
+
for program in test_programs:
|
| 324 |
+
program_id = program.get("id", "")
|
| 325 |
+
program_name = program.get("name", "Unknown Program")
|
| 326 |
+
program_desc = program.get("description", "")
|
| 327 |
+
entry = (f"{program_name} - {program_desc}", program_id)
|
| 328 |
+
program_options.append(entry)
|
| 329 |
+
print(f"[DEBUG] 드롭다운 옵션 추가: {entry}")
|
| 330 |
+
|
| 331 |
+
# 디버그 정보 추가
|
| 332 |
+
print(f"[DEBUG] 프로그램 옵션 만들기 완료 - 개수: {len(program_options)}, 데이터: {program_options}")
|
| 333 |
+
|
| 334 |
+
# HTML 생성
|
| 335 |
+
html_output = "<div style='padding: 10px; background-color: #e6f7ff; border-radius: 5px;'>"
|
| 336 |
+
html_output += "<h4>테스트 용 프로그램 목록</h4>"
|
| 337 |
+
html_output += "<ul>"
|
| 338 |
+
for program in test_programs:
|
| 339 |
+
html_output += f"<li><strong>{program['name']}</strong> - {program['description']}</li>"
|
| 340 |
+
html_output += "</ul>"
|
| 341 |
+
html_output += "</div>"
|
| 342 |
+
|
| 343 |
+
print(f"[DEBUG] HTML 생성 완료, 결과 반환 준비 완료")
|
| 344 |
+
return html_output, program_options
|
| 345 |
|
| 346 |
if response.status_code == 200:
|
| 347 |
result_json = response.json()
|
|
|
|
| 600 |
outputs=[device_info_result]
|
| 601 |
)
|
| 602 |
|
| 603 |
+
# 프로그램 실행 이벤트 - Gradio 문제 테스트
|
| 604 |
get_programs_btn.click(
|
| 605 |
fn=get_programs,
|
| 606 |
inputs=None,
|
| 607 |
outputs=[programs_result, program_dropdown]
|
| 608 |
)
|
| 609 |
|
| 610 |
+
# 드롭다운 값 변경 시 디버그 정보 출력
|
| 611 |
program_dropdown.change(
|
| 612 |
+
fn=lambda x: print(f"[DEBUG] 프로그램 선택됨: {x}") or (
|
| 613 |
+
"<div style='padding: 15px; background-color: #d4edda; border-radius: 5px; border-left: 5px solid #28a745;'>"
|
| 614 |
+
f"<p>선택한 프로그램: {x}</p>"
|
| 615 |
+
"<p>'프로그램 실행' 버튼을 클릭하세요.</p>"
|
| 616 |
+
"</div>" if x else ""
|
| 617 |
+
),
|
| 618 |
inputs=[program_dropdown],
|
| 619 |
outputs=[execute_result]
|
| 620 |
)
|
|
|
|
| 627 |
|
| 628 |
# 앱 실행
|
| 629 |
if __name__ == "__main__":
|
| 630 |
+
print("=== LocalPCAgent 웹 인터페이스 시작 ===\n")
|
| 631 |
+
print("* 다양한 오류 디버깅을 위해 로그를 자세히 출력합니다.")
|
| 632 |
+
print("* 구현된 테스트 기능을 통해 드롭다운 작동 여부를 확인합니다.\n")
|
| 633 |
+
|
| 634 |
# 디버그 모드로 실행하여 오류 추적이 쉽도록 함
|
| 635 |
demo.launch(debug=True, show_error=True) # 디버그 모드로 문제 원인 파악을 용이하게 함
|
| 636 |
+
print("\n=== 웹 인터페이스 종료 ===")
|