diff --git a/kjvstudy_org/routes/main.py b/kjvstudy_org/routes/main.py index 2ecff19..303ba3e 100644 --- a/kjvstudy_org/routes/main.py +++ b/kjvstudy_org/routes/main.py @@ -1,5 +1,6 @@ """Main page routes - homepage, books browser, and resources.""" import re +from datetime import date from fastapi import APIRouter, Request from fastapi.responses import HTMLResponse @@ -11,6 +12,9 @@ from .misc import get_daily_verse router = APIRouter() templates = None +# Server-side cache for homepage (rebuilds once per day) +_homepage_cache = {"date": None, "html": None} + def init_templates(t: Jinja2Templates): """Initialize templates for main routes.""" @@ -54,6 +58,10 @@ def verse_reference_to_url(reference: str): @router.get("/", response_class=HTMLResponse) async def read_root(request: Request): + today = date.today() + if _homepage_cache["date"] == today and _homepage_cache["html"] is not None: + return HTMLResponse(content=_homepage_cache["html"], headers={"Cache-Control": "public, max-age=3600"}) + books = bible.get_books() daily_verse = get_daily_verse() @@ -172,8 +180,12 @@ async def read_root(request: Request): for verse in guide['verses'] ] - return templates.TemplateResponse( - request, "index.html", {"books": books, "daily_verse": daily_verse, "study_guides": study_guides} + html = templates.get_template("index.html").render( + {"request": request, "books": books, "daily_verse": daily_verse, "study_guides": study_guides} + ) + _homepage_cache["date"] = today + _homepage_cache["html"] = html + return HTMLResponse(content=html, headers={"Cache-Control": "public, max-age=3600"} ) diff --git a/kjvstudy_org/server.py b/kjvstudy_org/server.py index a8aa179..5b014bc 100644 --- a/kjvstudy_org/server.py +++ b/kjvstudy_org/server.py @@ -175,10 +175,13 @@ class CacheControlMiddleware(BaseHTTPMiddleware): response = await call_next(request) # Skip caching for API endpoints and dynamic content - if request.url.path.startswith("/api/") or request.url.path in ["/", "/verse-of-the-day", "/random-verse"]: + if request.url.path.startswith("/api/") or request.url.path in ["/verse-of-the-day", "/random-verse"]: response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate" response.headers["Pragma"] = "no-cache" response.headers["Expires"] = "0" + # Homepage - cache for 1 hour (only changes daily with verse of the day) + elif request.url.path == "/": + response.headers["Cache-Control"] = "public, max-age=3600" # Static files (CSS, JS, images) - cache for 1 year elif request.url.path.startswith("/static/"): response.headers["Cache-Control"] = "public, max-age=31536000, immutable"