Fix admin template response for Starlette 1.x

This commit is contained in:
dwindown
2026-04-01 18:10:38 +07:00
parent 7716b119f7
commit 90831963fc

View File

@@ -93,11 +93,36 @@ class EnvCredentialProvider(Provider):
app.post("/password")(self.password)
app.add_middleware(BaseHTTPMiddleware, dispatch=self.authenticate)
def _template_response(
self,
request: Request,
name: str,
context: Dict[str, Any],
status_code: int = 200,
):
"""Build a template response compatible with old/new Starlette signatures."""
payload = {"request": request, **context}
try:
# Starlette >= 1.0
return templates.TemplateResponse(
request=request,
name=name,
context=payload,
status_code=status_code,
)
except TypeError:
# Starlette < 1.0
return templates.TemplateResponse(
name,
context=payload,
status_code=status_code,
)
async def login_view(self, request: Request):
return templates.TemplateResponse(
self.template,
return self._template_response(
request=request,
name=self.template,
context={
"request": request,
"login_logo_url": self.login_logo_url,
"login_title": self.login_title,
},
@@ -114,11 +139,11 @@ class EnvCredentialProvider(Provider):
secrets.compare_digest(username, self._username)
and secrets.compare_digest(password, self._password)
):
return templates.TemplateResponse(
self.template,
return self._template_response(
request=request,
name=self.template,
status_code=HTTP_401_UNAUTHORIZED,
context={
"request": request,
"error": "Invalid username or password",
"login_logo_url": self.login_logo_url,
"login_title": self.login_title,
@@ -174,9 +199,10 @@ class EnvCredentialProvider(Provider):
return response
async def password_view(self, request: Request, resources=Depends(get_resources)):
return templates.TemplateResponse(
"providers/login/password.html",
context={"request": request, "resources": resources},
return self._template_response(
request=request,
name="providers/login/password.html",
context={"resources": resources},
)
async def password(
@@ -190,19 +216,19 @@ class EnvCredentialProvider(Provider):
):
_ = admin
if not secrets.compare_digest(old_password, self._password):
return templates.TemplateResponse(
"providers/login/password.html",
return self._template_response(
request=request,
name="providers/login/password.html",
context={
"request": request,
"resources": resources,
"error": "Old password is incorrect",
},
)
if new_password != re_new_password:
return templates.TemplateResponse(
"providers/login/password.html",
return self._template_response(
request=request,
name="providers/login/password.html",
context={
"request": request,
"resources": resources,
"error": "New passwords do not match",
},