import os import sys from types import ModuleType # 1. SET ENVIRONMENT FIRST os.environ["KERAS_BACKEND"] = "torch" os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3" # Suppress TF logs # 2. INLINE MONKEY-PATCH (Absolute priority) def _patch(): if "tensorflow" in sys.modules: return try: import keras tf = ModuleType("tensorflow") sys.modules["tensorflow"] = tf tf.keras = keras sys.modules["tensorflow.keras"] = keras # Essential submodules for 'fer' import keras.models, keras.layers sys.modules["tensorflow.keras.models"] = keras.models sys.modules["tensorflow.keras.layers"] = keras.layers # Support for 'tensorflow.python.keras' tf_py = ModuleType("tensorflow.python") sys.modules["tensorflow.python"] = tf_py tf_py.keras = keras sys.modules["tensorflow.python.keras"] = keras print("Inline monkey-patch success.") except Exception as e: print(f"Inline monkey-patch failed: {e}") _patch() # 3. NOW PROCEED WITH OTHER IMPORTS from fastapi import FastAPI, Request from fastapi.responses import RedirectResponse from fastapi.staticfiles import StaticFiles from fastapi.templating import Jinja2Templates from app.database import engine, Base from app.routers import auth, dashboard, emotion, activities, diary # Create Database Tables Base.metadata.create_all(bind=engine) app = FastAPI(title="NeuroSense") # Get base directory (backend root) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) FRONTEND_DIR = os.path.join(os.path.dirname(BASE_DIR), "frontend") # Ensure necessary directories exist in backend/data os.makedirs(os.path.join(BASE_DIR, "data/uploads/emotions"), exist_ok=True) os.makedirs(os.path.join(BASE_DIR, "data/uploads/diary"), exist_ok=True) os.makedirs(os.path.join(BASE_DIR, "data/reports"), exist_ok=True) # Mount Static Files (CSS, JS) from frontend folder app.mount("/static", StaticFiles(directory=os.path.join(FRONTEND_DIR, "static")), name="static") # Mount Data Folders for viewing (from backend/data) app.mount("/uploads", StaticFiles(directory=os.path.join(BASE_DIR, "data/uploads")), name="uploads") app.mount("/reports", StaticFiles(directory=os.path.join(BASE_DIR, "data/reports")), name="reports") # Templates from frontend/templates templates = Jinja2Templates(directory=os.path.join(FRONTEND_DIR, "templates")) # Include Routers app.include_router(auth.router) app.include_router(dashboard.router) app.include_router(emotion.router) app.include_router(activities.router) app.include_router(diary.router) # Page Routes @app.get("/") def home_page(request: Request): # Root is Dashboard return templates.TemplateResponse(request, "dashboard.html", {"request": request}) @app.get("/login") def login_page(request: Request): return templates.TemplateResponse(request, "login.html", {"request": request}) @app.get("/children") def children_page(request: Request): return templates.TemplateResponse(request, "children.html", {"request": request}) @app.get("/emotion-learning") def emotion_page(request: Request): return templates.TemplateResponse(request, "emotion.html", {"request": request}) @app.get("/activities") def activities_page(request: Request): return templates.TemplateResponse(request, "activities.html", {"request": request}) @app.get("/game/{game_name}") def game_page(request: Request, game_name: str): return templates.TemplateResponse(request, "game.html", {"request": request, "game_name": game_name}) @app.get("/dashboard") def dashboard_redirect(request: Request): return RedirectResponse(url="/") @app.get("/diary") def diary_page(request: Request): return templates.TemplateResponse(request, "diary.html", {"request": request}) @app.get("/quiz") def quiz_page(request: Request): return templates.TemplateResponse(request, "quiz.html", {"request": request}) if __name__ == "__main__": import uvicorn uvicorn.run(app, host="127.0.0.1", port=8000)