nehal2006's picture
Ultra-robust monkey-patching and FER import safety
af6288c
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)