fix: bypass Starlette Jinja2Templates, use raw Jinja2 to avoid cache_key hash bug

This commit is contained in:
2026-07-05 18:13:12 +07:00
parent 1ad2afbbd6
commit 1ff473b6c6

View File

@@ -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)
)