Fix admin template response for Starlette 1.x
This commit is contained in:
56
app/admin.py
56
app/admin.py
@@ -93,11 +93,36 @@ class EnvCredentialProvider(Provider):
|
||||
app.post("/password")(self.password)
|
||||
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(
|
||||
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={
|
||||
"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",
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user