import os from fastapi import HTTPException from fastapi.responses import HTMLResponse, FileResponse from fastapi.staticfiles import StaticFiles from starlette.responses import Response from starlette.types import Scope, Receive, Send class NoCacheStaticFiles(StaticFiles): """StaticFiles que agrega headers para evitar cache""" async def get_response(self, path: str, scope: Scope) -> Response: """Override para agregar headers de no-cache""" response = await super().get_response(path, scope) # Agregar headers para evitar cache response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate, max-age=0" response.headers["Pragma"] = "no-cache" response.headers["Expires"] = "0" return response async def serve_app_html(): """Serve the main HTML file""" index_path = os.path.join("public","main", "index.html") if not os.path.exists(index_path): raise HTTPException(status_code=404, detail="public/index.html not found.") # Headers para evitar cache headers = { "Cache-Control": "no-cache, no-store, must-revalidate, max-age=0", "Pragma": "no-cache", "Expires": "0" } return FileResponse(index_path, headers=headers) async def serve_register_html(): """Serve the register HTML file""" register_path = os.path.join("public", "register", "index.html") if not os.path.exists(register_path): raise HTTPException(status_code=404, detail="public/register/index.html not found.") # Headers para evitar cache headers = { "Cache-Control": "no-cache, no-store, must-revalidate, max-age=0", "Pragma": "no-cache", "Expires": "0" } return FileResponse(register_path, headers=headers) def mount_register_static_files(app): """Mount static files for the register page""" app.mount("/register/", NoCacheStaticFiles(directory="public/register", html=False), name="register_static") def mount_main_static_files(app): """Mount static files""" app.mount("/express/", NoCacheStaticFiles(directory="public/main", html=False), name="public_root_assets") def serve_image(image_path: str): """Serve images from the public/images directory""" image_full_path = os.path.join("public", "images", image_path) if not os.path.exists(image_full_path): raise HTTPException(status_code=404, detail=f"Image '{image_path}' not found.") # Headers para evitar cache en imágenes también headers = { "Cache-Control": "no-cache, no-store, must-revalidate, max-age=0", "Pragma": "no-cache", "Expires": "0" } return FileResponse(image_full_path, headers=headers)