Spaces:
Sleeping
Sleeping
| 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 | |
| def home_page(request: Request): | |
| # Root is Dashboard | |
| return templates.TemplateResponse(request, "dashboard.html", {"request": request}) | |
| def login_page(request: Request): | |
| return templates.TemplateResponse(request, "login.html", {"request": request}) | |
| def children_page(request: Request): | |
| return templates.TemplateResponse(request, "children.html", {"request": request}) | |
| def emotion_page(request: Request): | |
| return templates.TemplateResponse(request, "emotion.html", {"request": request}) | |
| def activities_page(request: Request): | |
| return templates.TemplateResponse(request, "activities.html", {"request": request}) | |
| def game_page(request: Request, game_name: str): | |
| return templates.TemplateResponse(request, "game.html", {"request": request, "game_name": game_name}) | |
| def dashboard_redirect(request: Request): | |
| return RedirectResponse(url="/") | |
| def diary_page(request: Request): | |
| return templates.TemplateResponse(request, "diary.html", {"request": request}) | |
| 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) | |