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.post("/password")(self.password)
app.add_middleware(BaseHTTPMiddleware, dispatch=self.authenticate) app.add_middleware(BaseHTTPMiddleware, dispatch=self.authenticate)
async def login_view(self, request: Request): 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( return templates.TemplateResponse(
self.template, 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 self._template_response(
request=request,
name=self.template,
context={ context={
"request": request,
"login_logo_url": self.login_logo_url, "login_logo_url": self.login_logo_url,
"login_title": self.login_title, "login_title": self.login_title,
}, },
@@ -114,11 +139,11 @@ class EnvCredentialProvider(Provider):
secrets.compare_digest(username, self._username) secrets.compare_digest(username, self._username)
and secrets.compare_digest(password, self._password) and secrets.compare_digest(password, self._password)
): ):
return templates.TemplateResponse( return self._template_response(
self.template, request=request,
name=self.template,
status_code=HTTP_401_UNAUTHORIZED, status_code=HTTP_401_UNAUTHORIZED,
context={ context={
"request": request,
"error": "Invalid username or password", "error": "Invalid username or password",
"login_logo_url": self.login_logo_url, "login_logo_url": self.login_logo_url,
"login_title": self.login_title, "login_title": self.login_title,
@@ -174,9 +199,10 @@ class EnvCredentialProvider(Provider):
return response return response
async def password_view(self, request: Request, resources=Depends(get_resources)): async def password_view(self, request: Request, resources=Depends(get_resources)):
return templates.TemplateResponse( return self._template_response(
"providers/login/password.html", request=request,
context={"request": request, "resources": resources}, name="providers/login/password.html",
context={"resources": resources},
) )
async def password( async def password(
@@ -190,19 +216,19 @@ class EnvCredentialProvider(Provider):
): ):
_ = admin _ = admin
if not secrets.compare_digest(old_password, self._password): if not secrets.compare_digest(old_password, self._password):
return templates.TemplateResponse( return self._template_response(
"providers/login/password.html", request=request,
name="providers/login/password.html",
context={ context={
"request": request,
"resources": resources, "resources": resources,
"error": "Old password is incorrect", "error": "Old password is incorrect",
}, },
) )
if new_password != re_new_password: if new_password != re_new_password:
return templates.TemplateResponse( return self._template_response(
"providers/login/password.html", request=request,
name="providers/login/password.html",
context={ context={
"request": request,
"resources": resources, "resources": resources,
"error": "New passwords do not match", "error": "New passwords do not match",
}, },