From 1ff473b6c693960094f5f5079290dbd43205f867 Mon Sep 17 00:00:00 2001 From: smolkik-code Date: Sun, 5 Jul 2026 18:13:12 +0700 Subject: [PATCH] fix: bypass Starlette Jinja2Templates, use raw Jinja2 to avoid cache_key hash bug --- app/admin/router.py | 63 ++++++++++++++++++++++++--------------------- 1 file changed, 34 insertions(+), 29 deletions(-) diff --git a/app/admin/router.py b/app/admin/router.py index f638b94..f486acc 100644 --- a/app/admin/router.py +++ b/app/admin/router.py @@ -1,6 +1,7 @@ +from jinja2 import Environment, FileSystemLoader + from fastapi import APIRouter, Request from fastapi.responses import HTMLResponse -from fastapi.templating import Jinja2Templates from sqlalchemy import func, select from app.database import async_session_factory @@ -14,10 +15,13 @@ from app.repositories.tariff import TariffRepository from app.repositories.user import UserRepository router = APIRouter(prefix="/admin", tags=["admin"]) -templates = Jinja2Templates(directory="app/templates") -router = APIRouter(prefix="/admin", tags=["admin"]) -templates = Jinja2Templates(directory="app/templates") +_env = Environment(loader=FileSystemLoader("app/templates"), auto_reload=False) + + +def _render(name: str, **context) -> str: + template = _env.get_template(name) + return template.render(**context) @router.get("/", response_class=HTMLResponse) @@ -45,19 +49,19 @@ async def dashboard(request: Request): ) total_revenue = float((await session.execute(rev_stmt)).scalar_one()) - return templates.TemplateResponse( - "dashboard.html", - { - "request": request, - "total_users": total_users, - "active_users": active_users, - "total_tariffs": total_tariffs, - "total_servers": total_servers, - "active_servers": active_servers, - "total_payments": total_payments, - "confirmed_payments": confirmed_payments, - "total_revenue": total_revenue, - }, + return HTMLResponse( + _render( + "dashboard.html", + request=request, + total_users=total_users, + active_users=active_users, + total_tariffs=total_tariffs, + total_servers=total_servers, + active_servers=active_servers, + total_payments=total_payments, + confirmed_payments=confirmed_payments, + total_revenue=total_revenue, + ) ) @@ -67,9 +71,8 @@ async def users_page(request: Request): repo = UserRepository(session) users = await repo.get_all() - return templates.TemplateResponse( - "users.html", - {"request": request, "users": users}, + return HTMLResponse( + _render("users.html", request=request, users=users) ) @@ -88,9 +91,13 @@ async def payments_page(request: Request): t = await tariff_repo.get(p.tariff_id) tariffs_map[p.tariff_id] = t.name if t else "—" - return templates.TemplateResponse( - "payments.html", - {"request": request, "payments": payments, "tariffs_map": tariffs_map}, + return HTMLResponse( + _render( + "payments.html", + request=request, + payments=payments, + tariffs_map=tariffs_map, + ) ) @@ -100,9 +107,8 @@ async def servers_page(request: Request): repo = ServerRepository(session) servers = await repo.get_all() - return templates.TemplateResponse( - "servers.html", - {"request": request, "servers": servers}, + return HTMLResponse( + _render("servers.html", request=request, servers=servers) ) @@ -112,7 +118,6 @@ async def tariffs_page(request: Request): repo = TariffRepository(session) tariffs = await repo.get_all() - return templates.TemplateResponse( - "tariffs.html", - {"request": request, "tariffs": tariffs}, + return HTMLResponse( + _render("tariffs.html", request=request, tariffs=tariffs) )