2018-11-08 16:14:14 +00:00
|
|
|
Starlette is not *strictly* coupled to any particular templating engine, but
|
|
|
|
Jinja2 provides an excellent choice.
|
2018-11-06 16:57:57 +00:00
|
|
|
|
2019-02-18 13:12:55 +00:00
|
|
|
Starlette provides a simple way to get `jinja2` configured. This is probably
|
|
|
|
what you want to use by default.
|
2018-11-06 16:57:57 +00:00
|
|
|
|
|
|
|
```python
|
|
|
|
from starlette.applications import Starlette
|
2019-02-18 13:12:55 +00:00
|
|
|
from starlette.templating import Jinja2Templates
|
2018-11-06 16:57:57 +00:00
|
|
|
|
|
|
|
|
2019-02-18 13:12:55 +00:00
|
|
|
templates = Jinja2Templates(directory='templates')
|
2018-11-06 16:57:57 +00:00
|
|
|
|
|
|
|
app = Starlette(debug=True)
|
|
|
|
app.mount('/static', StaticFiles(directory='statics'), name='static')
|
|
|
|
|
|
|
|
|
|
|
|
@app.route('/')
|
|
|
|
async def homepage(request):
|
2019-02-18 13:12:55 +00:00
|
|
|
return templates.TemplateResponse('index.html', {'request': request})
|
2018-11-06 16:57:57 +00:00
|
|
|
```
|
|
|
|
|
2019-02-18 13:12:55 +00:00
|
|
|
The Jinja2 environment sets up a global `url_for` included, which allows us to
|
|
|
|
use `url_for` inside our templates. We always need to pass the incoming `request`
|
|
|
|
instance as part of the template context.
|
2018-11-06 16:57:57 +00:00
|
|
|
|
2018-11-06 17:03:34 +00:00
|
|
|
We can now link to static files from within our HTML templates. For example:
|
|
|
|
|
|
|
|
```html
|
|
|
|
<link href="{{ url_for('static', path='/css/bootstrap.min.css') }}" rel="stylesheet">
|
|
|
|
```
|
|
|
|
|
2019-02-18 13:12:55 +00:00
|
|
|
## Testing template responses
|
|
|
|
|
|
|
|
When using the test client, template responses include `.template` and `.context`
|
|
|
|
attributes.
|
|
|
|
|
|
|
|
```python
|
|
|
|
def test_homepage():
|
|
|
|
client = TestClient(app)
|
|
|
|
response = client.get("/")
|
|
|
|
assert response.status_code == 200
|
|
|
|
assert response.template.name == 'index.html'
|
|
|
|
assert "request" in response.context
|
|
|
|
```
|
|
|
|
|
2018-11-06 16:57:57 +00:00
|
|
|
## Asynchronous template rendering
|
|
|
|
|
|
|
|
Jinja2 supports async template rendering, however as a general rule
|
|
|
|
we'd recommend that you keep your templates free from logic that invokes
|
|
|
|
database lookups, or other I/O operations.
|
|
|
|
|
|
|
|
Instead we'd recommend that you ensure that your views perform all I/O,
|
|
|
|
for example, strictly evaluate any database queries within the view and
|
|
|
|
include the final results in the context.
|