""" RAG 검색 챗봇 메인 실행 파일 """ # os 모듈 임포트 import os import logging # 로깅 설정 logging.basicConfig( format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO ) logger = logging.getLogger(__name__) try: # 앱 모듈에서 Flask 앱 가져오기 from app.app import app # 장치 라우트 등록 코드 추가 try: from flask_cors import CORS from app.app_device_routes import register_device_routes # CORS 설정 CORS(app, supports_credentials=True) # 장치 서버 URL 환경 변수 (대문자로 변경) DEVICE_SERVER_URL = os.getenv('DEVICE_SERVER_URL', 'http://localhost:5050') logger.info(f"장치 서버 URL: {DEVICE_SERVER_URL}") # 인증 데코레이터 가져오기 from app.app import login_required # 인증 데코레이터 오버라이드 (장치 API 인증 우회) from functools import wraps from flask import request, session, redirect, url_for def device_login_required(f): @wraps(f) def decorated_function(*args, **kwargs): # API 요청이고 클라이언트에서 오는 경우 인증 무시 (임시 조치) if request.path.startswith('/api/device/'): logger.info(f"장치 API 요청: {request.path} - 인증 제외") return f(*args, **kwargs) # 그 외에는 기존 login_required 사용 return login_required(f)(*args, **kwargs) return decorated_function # 장치 라우트 등록 (대문자 변수명 사용) register_device_routes(app, device_login_required, DEVICE_SERVER_URL) logger.info("장치 라우트 직접 등록 성공") # 404 오류 핸들러 등록 @app.errorhandler(404) def not_found(e): # 클라이언트가 JSON을 기대하는 API 호출인 경우 JSON 응답 from flask import request, jsonify if request.path.startswith('/api/'): return jsonify({"success": False, "error": "요청한 API 엔드포인트를 찾을 수 없습니다."}), 404 # 일반 웹 페이지 요청인 경우 HTML 응답 return "페이지를 찾을 수 없습니다.", 404 except Exception as e: logger.error(f"장치 라우트 등록 실패: {e}", exc_info=True) except ImportError as e: logger.error(f"앱 모듈 가져오기 실패: {e}") raise if __name__ == '__main__': port = int(os.environ.get("PORT", 7860)) logger.info(f"서버를 http://0.0.0.0:{port} 에서 시작합니다.") app.run(debug=False, host='0.0.0.0', port=port)