diff --git a/app_web.py b/app_web.py index 5730476..390da5f 100644 --- a/app_web.py +++ b/app_web.py @@ -2,6 +2,7 @@ import asyncio import contextlib import html import importlib.util +import inspect import io import json import logging @@ -29,6 +30,23 @@ logger = logging.getLogger("uvicorn.error") app = FastAPI(title="Telegram Scraper Web Console") templates = Jinja2Templates(directory=str(TEMPLATES_DIR)) +# Starlette 较新版本:TemplateResponse(request, name, context);旧版:(name, context) +_template_response_new_style: Optional[bool] = None + + +def template_response(request: Request, name: str, context: Dict[str, Any]): + global _template_response_new_style + if _template_response_new_style is None: + keys = list(inspect.signature(templates.TemplateResponse).parameters.keys()) + if keys and keys[0] == "self": + keys = keys[1:] + _template_response_new_style = bool(keys) and keys[0] == "request" + ctx = dict(context) + ctx.setdefault("request", request) + if _template_response_new_style: + return templates.TemplateResponse(request, name, ctx) + return templates.TemplateResponse(name, ctx) + @app.on_event("startup") async def _verify_runtime_files() -> None: @@ -616,10 +634,10 @@ async def index(request: Request): account_channels = await service.list_account_channels() except Exception as e: err = str(e) - return templates.TemplateResponse( + return template_response( + request, "index.html", { - "request": request, "fields": fields, "binary_env_keys": list(BINARY_ENV_KEYS), "monitored": monitored,