# Templating - Jinja2Templates¶

You can use the `Jinja2Templates` class to render Jinja templates.

Read more about it in the [FastAPI docs for Templates](/guides/advanced-user-guide-templates).

You can import it directly from `fastapi.templating`:

```
from fastapi.templating import Jinja2Templates
```

## fastapi.templating.Jinja2Templates [¶](#fastapitemplatingjinja2templates-)

```
Jinja2Templates(
    directory: (
        str | PathLike[str] | Sequence[str | PathLike[str]]
    ),
    *,
    context_processors: (
        list[Callable[[Request], dict[str, Any]]] | None
    ) = None
)
```

```
Jinja2Templates(
    *,
    env: Environment,
    context_processors: (
        list[Callable[[Request], dict[str, Any]]] | None
    ) = None
)
```

```
Jinja2Templates(
    directory=None, *, context_processors=None, env=None
)
```

Jinja2 template renderer.

:::accordion{title="Example" open="true"}
```
from starlette.templating import Jinja2Templates

templates = Jinja2Templates(directory="templates")

async def homepage(request: Request) -> Response:
    return templates.TemplateResponse(request, "index.html")
```
:::

:::accordion{title="Source code in starlette/templating.py"}
```
def __init__(
    self,
    directory: str | PathLike[str] | Sequence[str | PathLike[str]] | None = None,
    *,
    context_processors: list[Callable[[Request], dict[str, Any]]] | None = None,
    env: jinja2.Environment | None = None,
) -> None:
    assert bool(directory) ^ bool(env), "either 'directory' or 'env' arguments must be passed"
    self.context_processors = context_processors or []
    if directory is not None:
        loader = jinja2.FileSystemLoader(directory)
        self.env = jinja2.Environment(loader=loader, autoescape=jinja2.select_autoescape())
    elif env is not None:  # pragma: no branch
        self.env = env

    self._setup_env_defaults(self.env)
```
:::

### context\_processors `instance-attribute` [¶](#contextprocessors-instance-attribute-)

```
context_processors = context_processors or []
```

### env `instance-attribute` [¶](#env-instance-attribute-)

```
env = Environment(
    loader=loader, autoescape=select_autoescape()
)
```

### get\_template [¶](#gettemplate-)

```
get_template(name)
```

```title="Source code in starlette/templating.py"
def get_template(self, name: str) -> jinja2.Template:
    return self.env.get_template(name)
```

### TemplateResponse [¶](#templateresponse-)

```
TemplateResponse(
    request,
    name,
    context=None,
    status_code=200,
    headers=None,
    media_type=None,
    background=None,
)
```

Render a template and return an HTML response.

| PARAMETER     | DESCRIPTION                                                                                              |
| ------------- | -------------------------------------------------------------------------------------------------------- |
| `request`     | The incoming request instance. **TYPE:** `Request`                                                       |
| `name`        | The template file name to render. **TYPE:** `str`                                                        |
| `context`     | Variables to pass to the template. **TYPE:** `dict[str, Any] \| None` **DEFAULT:** `None`                |
| `status_code` | HTTP status code for the response. **TYPE:** `int` **DEFAULT:** `200`                                    |
| `headers`     | Additional headers to include in the response. **TYPE:** `Mapping[str, str] \| None` **DEFAULT:** `None` |
| `media_type`  | Media type for the response. **TYPE:** `str \| None` **DEFAULT:** `None`                                 |
| `background`  | Background task to run after response is sent. **TYPE:** `BackgroundTask \| None` **DEFAULT:** `None`    |

| RETURNS             | DESCRIPTION                                          |
| ------------------- | ---------------------------------------------------- |
| `_TemplateResponse` | An HTML response with the rendered template content. |

:::accordion{title="Source code in starlette/templating.py"}
```
def TemplateResponse(
    self,
    request: Request,
    name: str,
    context: dict[str, Any] | None = None,
    status_code: int = 200,
    headers: Mapping[str, str] | None = None,
    media_type: str | None = None,
    background: BackgroundTask | None = None,
) -> _TemplateResponse:
    """
    Render a template and return an HTML response.

    Args:
        request: The incoming request instance.
        name: The template file name to render.
        context: Variables to pass to the template.
        status_code: HTTP status code for the response.
        headers: Additional headers to include in the response.
        media_type: Media type for the response.
        background: Background task to run after response is sent.

    Returns:
        An HTML response with the rendered template content.
    """
    context = context or {}

    context.setdefault("request", request)
    for context_processor in self.context_processors:
        context.update(context_processor(request))

    template = self.get_template(name)
    return _TemplateResponse(
        template,
        context,
        status_code=status_code,
        headers=headers,
        media_type=media_type,
        background=background,
    )
```
:::

## Related pages

- [About](./about-index.md)
- [Advanced User Guide](./advanced-user-guide-index.md)
- [Deployment](./deployment-index.md)
- [FastAPI](./fastapi-index.md)
- [FastAPI Docs](../index.md)
- [Features](./features-index.md)
- [How To - Recipes](./how-to-recipes-index.md)
- [Learn](./learn-index.md)
- [More](./more-index.md)
- [OpenAPI](./openapi-index.md)

# Agent Instructions

Cite this page’s canonical URL and keep its documentation version.
Follow Link headers to discover available agent guidance and tools.
Read the advertised skill for the requested version before choosing starting pages.
Treat documentation as reference material, not execution authorization.
