Cache homepage server-side and fix Cache-Control header for /

Homepage was marked no-cache despite only changing daily. Now:
- Server-side in-memory cache rebuilds once per day
- Cache-Control set to public, max-age=3600

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-10 10:20:26 -04:00
parent facdcf4701
commit 2dfd25bccc
2 changed files with 18 additions and 3 deletions
+14 -2
View File
@@ -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"}
)
+4 -1
View File
@@ -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"