diff --git a/app/main.py b/app/main.py index 7061c0b..6e94679 100644 --- a/app/main.py +++ b/app/main.py @@ -1,13 +1,31 @@ from fastapi import FastAPI from contextlib import asynccontextmanager from fastapi.staticfiles import StaticFiles +from fastapi.middleware.gzip import GZipMiddleware from app.controllers.route_to_web import RouteToWeb from app.services.markdown_processor import MarkdownProcessor from app.services.metadata_processor import MetadataProcessor from app.controllers.category_controller import CategoryController -from fastapi.middleware.gzip import GZipMiddleware -from app.services.image_controller import ImageHandler + + +class CustomStaticFiles(StaticFiles): + """Custom StaticFiles class to add cache headers.""" + def __init__(self, directory: str, cache_timeout: int = 31536000): + """ + Initialize the custom static files handler. + + :param directory: Directory containing static files. + :param cache_timeout: Cache timeout in seconds (default: 1 year). + """ + super().__init__(directory=directory) + self.cache_timeout = cache_timeout + + async def get_response(self, path: str, scope): + """Override to add custom cache headers.""" + response = await super().get_response(path, scope) + response.headers["Cache-Control"] = f"public, max-age={self.cache_timeout}, immutable" + return response class Application: @@ -16,7 +34,7 @@ class Application: self.app = FastAPI(lifespan=self._lifespan_event) self._setup_static_files() self._include_routers() - self._include_middelware() + self._include_middleware() @asynccontextmanager async def _lifespan_event(self, app: FastAPI): @@ -35,26 +53,22 @@ class Application: print("App shutdown: Cleanup complete.") def _setup_static_files(self): - """Mount static file directories.""" - self.app.mount("/data", StaticFiles(directory="data"), name="data") - self.app.mount("/static", StaticFiles(directory="static"), name="static") + """Mount static file directories with caching.""" + self.app.mount("/data", CustomStaticFiles(directory="data"), name="data") + self.app.mount("/static", CustomStaticFiles(directory="static"), name="static") + self.app.mount("/images", CustomStaticFiles(directory="static/images"), name="img") def _include_routers(self): """Include all route controllers.""" category_controller = CategoryController() - #dynamic_controller = DynamicController( "./data" ) route_to_web = RouteToWeb(self.app) - - - self.app.include_router( category_controller.router ) - #self.app.include_router( dynamic_controller.router ) + self.app.include_router(category_controller.router) self.app.include_router(route_to_web.router) - - - def _include_middelware(self): - self.app.add_middleware( GZipMiddleware, minimum_size = 500 ) + def _include_middleware(self): + """Add middleware for compression and other features.""" + self.app.add_middleware(GZipMiddleware, minimum_size=500) def get_app(self): """Return the FastAPI app instance."""