Files
LifeFaq/app/main.py

80 lines
3.0 KiB
Python
Raw Normal View History

2024-12-11 23:56:15 +01:00
from fastapi import FastAPI
from contextlib import asynccontextmanager
from fastapi.staticfiles import StaticFiles
2024-12-21 23:47:48 +01:00
from fastapi.middleware.gzip import GZipMiddleware
2024-12-20 22:35:39 +01:00
from app.controllers.route_to_web import RouteToWeb
2024-12-11 23:56:15 +01:00
from app.services.markdown_processor import MarkdownProcessor
from app.services.metadata_processor import MetadataProcessor
from app.controllers.category_controller import CategoryController
2024-12-21 23:47:48 +01:00
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
2024-12-11 23:56:15 +01:00
class Application:
def __init__(self):
"""Initialize the FastAPI app and configure it."""
self.app = FastAPI(lifespan=self._lifespan_event)
self._setup_static_files()
self._include_routers()
2024-12-21 23:47:48 +01:00
self._include_middleware()
2024-12-11 23:56:15 +01:00
@asynccontextmanager
async def _lifespan_event(self, app: FastAPI):
"""Lifespan event for startup and shutdown logic."""
print("App startup: Processing Markdown files...")
# Generate dynamic JSON data
metadata_processor = MetadataProcessor(input_dir="./data", output_file="generated_data.json")
metadata_processor.generate_json()
print("Generated dynamic data file.")
print("Markdown processing complete!")
2024-12-12 23:30:19 +01:00
# Process Markdown files into HTML
processor = MarkdownProcessor(input_dir="./data", templates_dir="./templates")
processor.run()
2024-12-11 23:56:15 +01:00
yield
print("App shutdown: Cleanup complete.")
def _setup_static_files(self):
2024-12-21 23:47:48 +01:00
"""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")
2024-12-11 23:56:15 +01:00
def _include_routers(self):
"""Include all route controllers."""
category_controller = CategoryController()
2024-12-20 22:35:39 +01:00
route_to_web = RouteToWeb(self.app)
2024-12-16 23:15:37 +01:00
2024-12-21 23:47:48 +01:00
self.app.include_router(category_controller.router)
2024-12-20 22:35:39 +01:00
self.app.include_router(route_to_web.router)
2024-12-16 23:15:37 +01:00
2024-12-21 23:47:48 +01:00
def _include_middleware(self):
"""Add middleware for compression and other features."""
self.app.add_middleware(GZipMiddleware, minimum_size=500)
2024-12-11 23:56:15 +01:00
def get_app(self):
"""Return the FastAPI app instance."""
return self.app
application = Application()
app = application.get_app()