mirror of
https://github.com/kennethreitz/kjvstudy.org.git
synced 2026-06-05 14:50:17 +00:00
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:
@@ -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"}
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user