160 lines
4.6 KiB
Python
Executable File
160 lines
4.6 KiB
Python
Executable File
#!/usr/bin/env python
|
|
"""콜백 기능 테스트 스크립트"""
|
|
|
|
import os
|
|
import django
|
|
import json
|
|
import time
|
|
from http.server import HTTPServer, BaseHTTPRequestHandler
|
|
import threading
|
|
|
|
# Django 설정
|
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'executor.settings')
|
|
django.setup()
|
|
|
|
from strategies.models import StrategyExecution
|
|
import requests
|
|
|
|
|
|
class CallbackHandler(BaseHTTPRequestHandler):
|
|
"""콜백 수신용 간단한 HTTP 서버"""
|
|
|
|
received_data = None
|
|
|
|
def do_POST(self):
|
|
content_length = int(self.headers['Content-Length'])
|
|
post_data = self.rfile.read(content_length)
|
|
|
|
# 수신한 데이터 저장
|
|
CallbackHandler.received_data = json.loads(post_data.decode('utf-8'))
|
|
|
|
print("\n" + "="*80)
|
|
print("콜백 수신!")
|
|
print("="*80)
|
|
print(json.dumps(CallbackHandler.received_data, indent=2, ensure_ascii=False))
|
|
print("="*80 + "\n")
|
|
|
|
# 200 OK 응답
|
|
self.send_response(200)
|
|
self.send_header('Content-Type', 'application/json')
|
|
self.end_headers()
|
|
self.wfile.write(json.dumps({'status': 'received'}).encode('utf-8'))
|
|
|
|
def log_message(self, format, *args):
|
|
# 기본 로그 메시지 비활성화
|
|
pass
|
|
|
|
|
|
def start_callback_server(port=8888):
|
|
"""콜백 수신 서버 시작"""
|
|
server = HTTPServer(('localhost', port), CallbackHandler)
|
|
thread = threading.Thread(target=server.serve_forever, daemon=True)
|
|
thread.start()
|
|
print(f"✓ 콜백 서버 시작: http://localhost:{port}")
|
|
return server
|
|
|
|
|
|
def test_callback():
|
|
"""콜백 기능 테스트"""
|
|
print("\n" + "="*80)
|
|
print("콜백 기능 테스트")
|
|
print("="*80 + "\n")
|
|
|
|
# 1. 콜백 서버 시작
|
|
callback_port = 8888
|
|
callback_url = f"http://localhost:{callback_port}/callback"
|
|
server = start_callback_server(callback_port)
|
|
|
|
time.sleep(1)
|
|
|
|
# 2. 전략 실행 요청 (콜백 URL 포함)
|
|
print("전략 실행 요청 중...")
|
|
|
|
request_data = {
|
|
"strategy_name": "MovingAverageCrossover",
|
|
"parameters": {
|
|
"short_window": 10,
|
|
"long_window": 30,
|
|
"initial_capital": 50000
|
|
},
|
|
"callback_url": callback_url
|
|
}
|
|
|
|
response = requests.post(
|
|
'http://localhost:8000/strategies/execute/',
|
|
json=request_data
|
|
)
|
|
|
|
if response.status_code != 200:
|
|
print(f"✗ 실행 요청 실패: {response.text}")
|
|
server.shutdown()
|
|
return
|
|
|
|
result = response.json()
|
|
execution_id = result['execution_id']
|
|
print(f"✓ 실행 시작됨 (ID: {execution_id})")
|
|
print(f" 콜백 URL: {result.get('callback_url', 'N/A')}")
|
|
|
|
# 3. 전략 실행 완료 대기
|
|
print("\n전략 실행 완료 대기 중...")
|
|
max_wait = 30
|
|
waited = 0
|
|
|
|
while waited < max_wait:
|
|
time.sleep(2)
|
|
waited += 2
|
|
|
|
# 상태 확인
|
|
status_response = requests.get(f'http://localhost:8000/executions/{execution_id}/')
|
|
status_data = status_response.json()
|
|
|
|
print(f" 상태: {status_data['status']} ({waited}초 경과)")
|
|
|
|
if status_data['status'] in ['completed', 'failed']:
|
|
break
|
|
|
|
# 4. 콜백 수신 대기
|
|
print("\n콜백 수신 대기 중...")
|
|
time.sleep(3)
|
|
|
|
# 5. 결과 확인
|
|
status_response = requests.get(f'http://localhost:8000/executions/{execution_id}/')
|
|
final_status = status_response.json()
|
|
|
|
print("\n" + "="*80)
|
|
print("최종 결과")
|
|
print("="*80)
|
|
print(f"실행 상태: {final_status['status']}")
|
|
|
|
if 'callback' in final_status:
|
|
callback_info = final_status['callback']
|
|
print(f"\n콜백 정보:")
|
|
print(f" URL: {callback_info['url']}")
|
|
print(f" 전송 완료: {callback_info['sent']}")
|
|
print(f" 전송 시각: {callback_info['sent_at']}")
|
|
print(f" 응답 코드: {callback_info['response'].get('status_code', 'N/A')}")
|
|
|
|
if CallbackHandler.received_data:
|
|
print(f"\n✓ 콜백 데이터 수신 성공!")
|
|
print(f" 실행 ID: {CallbackHandler.received_data.get('execution_id')}")
|
|
print(f" 전략: {CallbackHandler.received_data.get('strategy')}")
|
|
print(f" 상태: {CallbackHandler.received_data.get('status')}")
|
|
else:
|
|
print(f"\n✗ 콜백 데이터 수신 실패")
|
|
|
|
print("="*80 + "\n")
|
|
|
|
# 6. 서버 종료
|
|
server.shutdown()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
try:
|
|
test_callback()
|
|
except KeyboardInterrupt:
|
|
print("\n\n테스트 중단됨")
|
|
except Exception as e:
|
|
print(f"\n\n✗ 오류 발생: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|