From 01770a87a3b289b1861c7c49ba429a25630d2068 Mon Sep 17 00:00:00 2001 From: Victor Da Luz Date: Thu, 16 Apr 2026 14:29:42 -0600 Subject: [PATCH] Fix Starlette 1.0.0 TemplateResponse API compatibility Starlette 1.0.0 changed the TemplateResponse calling convention. The old positional API passed the template name first and a dict containing the request object: TemplateResponse("name.html", {"request": request, ...}) The new API takes the request as the first argument and removes it from the context dict: TemplateResponse(request, "name.html", {...}) The old style causes a TypeError at runtime with Starlette 1.0.0+, breaking every page that renders an HTML response. Updated all 14 TemplateResponse calls across the five route files. --- web/routes/app_auth.py | 12 ++++++++---- web/routes/collections.py | 4 ++-- web/routes/discover.py | 2 +- web/routes/library.py | 8 ++++---- web/routes/settings.py | 2 +- 5 files changed, 16 insertions(+), 12 deletions(-) diff --git a/web/routes/app_auth.py b/web/routes/app_auth.py index e885aab..664eb1c 100644 --- a/web/routes/app_auth.py +++ b/web/routes/app_auth.py @@ -52,8 +52,9 @@ def login_page(request: Request, next: str = "/"): return RedirectResponse(url="/setup", status_code=303) return templates.TemplateResponse( + request, "login.html", - {"request": request, "next": next, "error": ""}, + {"next": next, "error": ""}, ) @@ -68,8 +69,9 @@ def auth_login( user = verify_user(username, password) if user is None: return templates.TemplateResponse( + request, "login.html", - {"request": request, "next": next, "error": "Invalid username or password"}, + {"next": next, "error": "Invalid username or password"}, status_code=401, ) @@ -90,8 +92,9 @@ def setup_page(request: Request): return RedirectResponse(url="/login", status_code=303) return templates.TemplateResponse( + request, "setup.html", - {"request": request, "error": ""}, + {"error": ""}, ) @@ -117,8 +120,9 @@ def auth_setup( if error: return templates.TemplateResponse( + request, "setup.html", - {"request": request, "error": error}, + {"error": error}, status_code=400, ) diff --git a/web/routes/collections.py b/web/routes/collections.py index 5fc7cd3..a8c25a1 100644 --- a/web/routes/collections.py +++ b/web/routes/collections.py @@ -72,9 +72,9 @@ def collections_page(request: Request, conn: sqlite3.Connection = Depends(get_db collections_with_covers.append(collection_dict) return templates.TemplateResponse( + request, "collections.html", { - "request": request, "collections": collections_with_covers } ) @@ -106,9 +106,9 @@ def collection_detail(request: Request, collection_id: int, conn: sqlite3.Connec grouped_games = group_games_by_igdb(games) return templates.TemplateResponse( + request, "collection_detail.html", { - "request": request, "collection": dict(collection), "games": grouped_games, "parse_json": parse_json_field diff --git a/web/routes/discover.py b/web/routes/discover.py index 8c5530b..e66ac6f 100644 --- a/web/routes/discover.py +++ b/web/routes/discover.py @@ -231,9 +231,9 @@ def discover(request: Request, conn: sqlite3.Connection = Depends(get_db)): has_igdb_ids = bool(igdb_ids) return templates.TemplateResponse( + request, "discover.html", { - "request": request, "highly_rated": highly_rated, "hidden_gems": hidden_gems, "most_played": most_played, diff --git a/web/routes/library.py b/web/routes/library.py index eebe7e6..e9e8a06 100644 --- a/web/routes/library.py +++ b/web/routes/library.py @@ -232,9 +232,9 @@ def get_sort_key(g): genre_counts = dict(sorted(genre_counts.items(), key=lambda x: (-x[1], x[0].lower()))) return templates.TemplateResponse( + request, "index.html", { - "request": request, "games": grouped_games, "store_counts": store_counts, "genre_counts": genre_counts, @@ -304,9 +304,9 @@ def game_detail(request: Request, game_id: int, conn: sqlite3.Connection = Depen primary_game = g return templates.TemplateResponse( + request, "game_detail.html", { - "request": request, "game": primary_game, "store_info": store_info, "related_games": related_games, @@ -355,9 +355,9 @@ def hidden_games( games = cursor.fetchall() return templates.TemplateResponse( + request, "hidden_games.html", { - "request": request, "games": games, "current_search": search, "parse_json": parse_json_field @@ -387,9 +387,9 @@ def removed_games( games = cursor.fetchall() return templates.TemplateResponse( + request, "removed_games.html", { - "request": request, "games": games, "current_search": search, "parse_json": parse_json_field diff --git a/web/routes/settings.py b/web/routes/settings.py index d86b559..32c816f 100644 --- a/web/routes/settings.py +++ b/web/routes/settings.py @@ -76,9 +76,9 @@ def settings_page( hidden_count = cursor.fetchone()[0] return templates.TemplateResponse( + request, "settings.html", { - "request": request, "settings": settings, "success": success_flag, "hidden_count": hidden_count,