Skip to content

Commit 9e50bc9

Browse files
Fix Deprecation Warnings for TemplateResponse and Jinja2Templates (#575)
* Ignore .venv * Fix DeprecationWarning: The `name` is not the first parameter anymore. Addresses #574 DeprecationWarning: The `name` is not the first parameter anymore. The first parameter should be the `Request` instance. Replace `TemplateResponse(name, {"request": request})` by `TemplateResponse(request, name)`. warnings.warn( Before Starlette 0.29.0, the name was the first parameter. Also, before that, in previous versions, the request object was passed as part of the key-value pairs in the context for Jinja2. See: - https://www.starlette.io/release-notes/#0290 - encode/starlette#2191 - https://github.com/encode/starlette/blob/c78c9aac17a4d68e0647252310044502f1b7da71/starlette/templating.py#L166-L178 - https://fastapi.tiangolo.com/reference/templating/#fastapi.templating.Jinja2Templates.TemplateResponse - https://fastapi.tiangolo.com/advanced/templates/#using-jinja2templates * Fix DeprecationWarning: Extra environment options are deprecated. Resolves #574 According to the Starlette 0.28.0 release notes, the **env_options parameter in Jinja2Templates has been deprecated in favor of the new env parameter. The relevant pull request #2159 explains this change. See: - encode/starlette#2159 - https://www.starlette.io/release-notes/#0280 * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent 5b183e0 commit 9e50bc9

File tree

5 files changed

+53
-31
lines changed

5 files changed

+53
-31
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ env*
33
.mypy_cache
44
.vscode
55
.idea
6+
.venv
67
poetry.lock
78
dist
89
htmlcov

docs/user-guide/getting-started/index.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,9 @@ from starlette_admin import CustomView
132132
class HomeView(CustomView):
133133
async def render(self, request: Request, templates: Jinja2Templates) -> Response:
134134
return templates.TemplateResponse(
135-
"home.html", {"request": request, "latest_posts": ..., "top_users": ...}
135+
request,
136+
name="home.html",
137+
context={"latest_posts": ..., "top_users": ...},
136138
)
137139

138140

starlette_admin/auth.py

+9-6
Original file line numberDiff line numberDiff line change
@@ -233,8 +233,9 @@ async def render_login(self, request: Request, admin: "BaseAdmin") -> Response:
233233
"""Render the default login page for username & password authentication."""
234234
if request.method == "GET":
235235
return admin.templates.TemplateResponse(
236-
"login.html",
237-
{"request": request, "_is_login_path": True},
236+
request=request,
237+
name="login.html",
238+
context={"_is_login_path": True},
238239
)
239240
form = await request.form()
240241
try:
@@ -251,14 +252,16 @@ async def render_login(self, request: Request, admin: "BaseAdmin") -> Response:
251252
)
252253
except FormValidationError as errors:
253254
return admin.templates.TemplateResponse(
254-
"login.html",
255-
{"request": request, "form_errors": errors, "_is_login_path": True},
255+
request=request,
256+
name="login.html",
257+
context={"form_errors": errors, "_is_login_path": True},
256258
status_code=HTTP_422_UNPROCESSABLE_ENTITY,
257259
)
258260
except LoginFailed as error:
259261
return admin.templates.TemplateResponse(
260-
"login.html",
261-
{"request": request, "error": error.msg, "_is_login_path": True},
262+
request=request,
263+
name="login.html",
264+
context={"error": error.msg, "_is_login_path": True},
262265
status_code=HTTP_400_BAD_REQUEST,
263266
)
264267

starlette_admin/base.py

+37-23
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from json import JSONDecodeError
33
from typing import Any, Awaitable, Callable, Dict, List, Optional, Sequence, Type, Union
44

5-
from jinja2 import ChoiceLoader, FileSystemLoader, PackageLoader
5+
from jinja2 import ChoiceLoader, Environment, FileSystemLoader, PackageLoader
66
from starlette.applications import Starlette
77
from starlette.datastructures import FormData
88
from starlette.exceptions import HTTPException
@@ -190,13 +190,17 @@ def init_routes(self) -> None:
190190
self._views.append(self.index_view)
191191

192192
def _setup_templates(self) -> None:
193-
templates = Jinja2Templates(self.templates_dir, extensions=["jinja2.ext.i18n"])
194-
templates.env.loader = ChoiceLoader(
195-
[
196-
FileSystemLoader(self.templates_dir),
197-
PackageLoader("starlette_admin", "templates"),
198-
]
193+
env = Environment(
194+
loader=ChoiceLoader(
195+
[
196+
FileSystemLoader(self.templates_dir),
197+
PackageLoader("starlette_admin", "templates"),
198+
]
199+
),
200+
extensions=["jinja2.ext.i18n"],
199201
)
202+
templates = Jinja2Templates(env=env)
203+
200204
# globals
201205
templates.env.globals["views"] = self._views
202206
templates.env.globals["app_title"] = self.title
@@ -374,9 +378,9 @@ async def _render_list(self, request: Request) -> Response:
374378
if not model.is_accessible(request):
375379
raise HTTPException(HTTP_403_FORBIDDEN)
376380
return self.templates.TemplateResponse(
377-
model.list_template,
378-
{
379-
"request": request,
381+
request=request,
382+
name=model.list_template,
383+
context={
380384
"model": model,
381385
"title": model.title(request),
382386
"_actions": await model.get_all_actions(request),
@@ -395,9 +399,9 @@ async def _render_detail(self, request: Request) -> Response:
395399
if obj is None:
396400
raise HTTPException(HTTP_404_NOT_FOUND)
397401
return self.templates.TemplateResponse(
398-
model.detail_template,
399-
{
400-
"request": request,
402+
request=request,
403+
name=model.detail_template,
404+
context={
401405
"title": model.title(request),
402406
"model": model,
403407
"raw_obj": obj,
@@ -410,11 +414,15 @@ async def _render_create(self, request: Request) -> Response:
410414
request.state.action = RequestAction.CREATE
411415
identity = request.path_params.get("identity")
412416
model = self._find_model_from_identity(identity)
413-
config = {"request": request, "title": model.title(request), "model": model}
417+
config = {"title": model.title(request), "model": model}
414418
if not model.is_accessible(request) or not model.can_create(request):
415419
raise HTTPException(HTTP_403_FORBIDDEN)
416420
if request.method == "GET":
417-
return self.templates.TemplateResponse(model.create_template, config)
421+
return self.templates.TemplateResponse(
422+
request=request,
423+
name=model.create_template,
424+
context=config,
425+
)
418426
form = await request.form()
419427
dict_obj = await self.form_to_dict(request, form, model, RequestAction.CREATE)
420428
try:
@@ -427,8 +435,9 @@ async def _render_create(self, request: Request) -> Response:
427435
}
428436
)
429437
return self.templates.TemplateResponse(
430-
model.create_template,
431-
config,
438+
request=request,
439+
name=model.create_template,
440+
context=config,
432441
status_code=HTTP_422_UNPROCESSABLE_ENTITY,
433442
)
434443
pk = await model.get_pk_value(request, obj)
@@ -452,14 +461,17 @@ async def _render_edit(self, request: Request) -> Response:
452461
if obj is None:
453462
raise HTTPException(HTTP_404_NOT_FOUND)
454463
config = {
455-
"request": request,
456464
"title": model.title(request),
457465
"model": model,
458466
"raw_obj": obj,
459467
"obj": await model.serialize(obj, request, RequestAction.EDIT),
460468
}
461469
if request.method == "GET":
462-
return self.templates.TemplateResponse(model.edit_template, config)
470+
return self.templates.TemplateResponse(
471+
request=request,
472+
name=model.edit_template,
473+
context=config,
474+
)
463475
form = await request.form()
464476
dict_obj = await self.form_to_dict(request, form, model, RequestAction.EDIT)
465477
try:
@@ -472,8 +484,9 @@ async def _render_edit(self, request: Request) -> Response:
472484
}
473485
)
474486
return self.templates.TemplateResponse(
475-
model.edit_template,
476-
config,
487+
request=request,
488+
name=model.edit_template,
489+
context=config,
477490
status_code=HTTP_422_UNPROCESSABLE_ENTITY,
478491
)
479492
pk = await model.get_pk_value(request, obj)
@@ -493,8 +506,9 @@ async def _render_error(
493506
) -> Response:
494507
assert isinstance(exc, HTTPException)
495508
return self.templates.TemplateResponse(
496-
"error.html",
497-
{"request": request, "exc": exc},
509+
request=request,
510+
name="error.html",
511+
context={"exc": exc},
498512
status_code=exc.status_code,
499513
)
500514

starlette_admin/views.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,9 @@ def __init__(
165165
async def render(self, request: Request, templates: Jinja2Templates) -> Response:
166166
"""Default methods to render view. Override this methods to add your custom logic."""
167167
return templates.TemplateResponse(
168-
self.template_path, {"request": request, "title": self.title(request)}
168+
request=request,
169+
name=self.template_path,
170+
context={"title": self.title(request)},
169171
)
170172

171173
def is_active(self, request: Request) -> bool:

0 commit comments

Comments
 (0)