From ac0e133a934d831622e23d2bdb3c37e8d6e58d27 Mon Sep 17 00:00:00 2001 From: Amin Alaee Date: Sun, 9 Jan 2022 12:36:32 +0100 Subject: [PATCH 1/2] Allow in env_options in Jinja2Templates --- starlette/templating.py | 13 +++++++++---- tests/test_templates.py | 9 +++++++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/starlette/templating.py b/starlette/templating.py index 18d5eb40c..a44edddc2 100644 --- a/starlette/templating.py +++ b/starlette/templating.py @@ -55,12 +55,14 @@ class Jinja2Templates: return templates.TemplateResponse("index.html", {"request": request}) """ - def __init__(self, directory: typing.Union[str, PathLike]) -> None: + def __init__( + self, directory: typing.Union[str, PathLike], **env_options: typing.Any + ) -> None: assert jinja2 is not None, "jinja2 must be installed to use Jinja2Templates" - self.env = self._create_env(directory) + self.env = self._create_env(directory, **env_options) def _create_env( - self, directory: typing.Union[str, PathLike] + self, directory: typing.Union[str, PathLike], **env_options: typing.Any ) -> "jinja2.Environment": @pass_context def url_for(context: dict, name: str, **path_params: typing.Any) -> str: @@ -68,7 +70,10 @@ def url_for(context: dict, name: str, **path_params: typing.Any) -> str: return request.url_for(name, **path_params) loader = jinja2.FileSystemLoader(directory) - env = jinja2.Environment(loader=loader, autoescape=True) + env_options.setdefault("loader", loader) + env_options.setdefault("autoescape", True) + + env = jinja2.Environment(**env_options) env.globals["url_for"] = url_for return env diff --git a/tests/test_templates.py b/tests/test_templates.py index 073482d65..68815d854 100644 --- a/tests/test_templates.py +++ b/tests/test_templates.py @@ -29,3 +29,12 @@ def test_template_response_requires_request(tmpdir): templates = Jinja2Templates(str(tmpdir)) with pytest.raises(ValueError): templates.TemplateResponse(None, {}) + + +def test_template_jinja2_env_options(tmpdir): + templates = Jinja2Templates( + directory=str(tmpdir), autoescape=False, auto_reload=True + ) + + assert templates.env.autoescape is False + assert templates.env.auto_reload is True From 1b2b01fb4e68ed23c77085b53e24859d14c4174e Mon Sep 17 00:00:00 2001 From: Amin Alaee Date: Wed, 19 Jan 2022 10:39:39 +0100 Subject: [PATCH 2/2] Update templates.md --- docs/templates.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/templates.md b/docs/templates.md index b67669920..181cd1fef 100644 --- a/docs/templates.md +++ b/docs/templates.md @@ -64,6 +64,20 @@ def test_homepage(): assert "request" in response.context ``` +## Customizing Jinja2 Environment + +`Jinja2Templates` accepts all options supported by Jinja2 `Environment`. +This will allow more control over the `Enivornment` instance created by Starlette. + +For the list of options available to `Environment` you can check Jinja2 documentation [here](https://jinja.palletsprojects.com/en/3.0.x/api/#jinja2.Environment) + +```python +from starlette.templating import Jinja2Templates + + +templates = Jinja2Templates(directory='templates', autoescape=False, auto_reload=True) +``` + ## Asynchronous template rendering Jinja2 supports async template rendering, however as a general rule