# portfolio/app.py from flask import Flask, render_template, url_for, redirect # from npc_social_network.routes.npc_route import npc_bp # from npc_social_network import simulation_core # from stock.routes.stock_route import stock_bp import threading import logging import os # ------------------------------------------------------------------- # 파일 1: portfolio/app.py (수정) # 역할: 전체 포트폴리오의 진입점. # NPC 시뮬레이션 스레드를 시작하고, 관련 URL 그룹(Blueprint)을 등록합니다. # ------------------------------------------------------------------- # 시뮬레이션이 여러 번 초기화되는 것을 방지하기 위한 잠금 장치 init_lock = threading.Lock() simulation_initialized = False # 특정 로그 메시지를 걸러내기 위한 필터 클래스 class LogFilter(logging.Filter): def filter(self, record): # /api/world_state 경로에 대한 로그는 기록하지 않음 if "/api/world_state" in record.getMessage(): return False if "/api/npc_details" in record.getMessage(): return False if "/api/toggle_simulation" in record.getMessage(): return False return True def create_app(): """Flask 앱을 생성하고, 필요한 Blueprint를 등록하는 팩토리 함수.""" app = Flask(__name__, template_folder='templates') # static/template 경로를 기본값 try: from npc_social_network.routes.npc_route import npc_bp app.register_blueprint(npc_bp) print("✅ 'npc_social' Blueprint가 성공적으로 등록되었습니다.") # app.register_blueprint(stock_bp) except Exception as e: import traceback print("="*60) print("❌ CRITICAL ERROR: Blueprint 등록 중 에러가 발생했습니다!") print(f" 에러 메시지: {e}") print("="*60) traceback.print_exc() # 에러의 전체 경로를 출력합니다. print("="*60) return app if __name__ == '__main__': # 1. flask 앱 실행 app = create_app() # Flask 앱이 실행되기 전에 로그 필터를 적용합니다. log = logging.getLogger('werkzeug') log.addFilter(LogFilter()) # use_reloader=False는 디버그 모드에서 앱이 두 번 실행되는 것을 방지하여, # 시뮬레이션 스레드가 두 번 시작되지 않도록 합니다. app.run(host='0.0.0.0', port=int(os.environ.get("PORT", 7860)))