Integrate Hotwire Turbo with Django with ease.
- Python 3.8+
- Django 3.1+
- Channels 3.0+ (Optional for Turbo Frames, but needed for Turbo Stream support)
Turbo Django is available on PyPI - to install it, just run:
pip install turbo-django
Add turbo
and channels
to INSTALLED_APPS
, and copy the following CHANNEL_LAYERS
setting:
INSTALLED_APPS = [
...
'turbo',
'channels'
...
]
CHANNEL_LAYERS = {
"default": {
# You will need to `pip install channels_redis` and configure a redis instance.
# Using InMemoryChannelLayer will not work as the memory is not shared between threads.
# See https://channels.readthedocs.io/en/latest/topics/channel_layers.html
"BACKEND": "channels_redis.core.RedisChannelLayer",
"CONFIG": {
"hosts": [("127.0.0.1", 6379)],
},
}
}
And collect static files if the development server is not hosting them:
./manage.py collectstatic
Note: Both Hotwire and this library are still in beta development and may introduce breaking API changes between releases. It is advised to pin the library to a specific version during install.
Want to see Hotwire in action? Here's a simple broadcast that can be setup in less than a minute.
The basics:
-
A Turbo Stream class is declared in python.
-
A template subscribes to the Turbo Stream.
-
HTML is be pushed to all subscribed pages which replaces the content of specified HTML p tag.
First, in a django app called quickstart
, declare BroadcastStream
in a file named streams.py
.
# streams.py
import turbo
class BroadcastStream(turbo.Stream):
pass
Then, create a template that subscribes to the stream.
from django.urls import path
from django.views.generic import TemplateView
urlpatterns = [
path('quickstart/', TemplateView.as_view(template_name='broadcast_example.html'))
]
# broadcast_example.html
{% load turbo_streams %}
<!DOCTYPE html>
<html lang="en">
<head>
{% include "turbo/head.html" %}
</head>
<body>
{% turbo_subscribe 'quickstart:BroadcastStream' %}
<p id="broadcast_box">Placeholder for broadcast</p>
</body>
</html>
Now run ./manage.py shell
. Import the Turbo Stream and tell the stream to take the current timestamp and update
the element with id broadcast_box
on all subscribed pages.
from quickstart.streams import BroadcastStream
from datetime import datetime
BroadcastStream().update(text=f"The date and time is now: {datetime.now()}", id="broadcast_box")
With the quickstart/
path open in a browser window, watch as the broadcast pushes messages to the page.
Now change .update()
to .append()
and resend the broadcast a few times. Notice you do not have to reload the page to get this modified behavior.
Excited to learn more? Be sure to walk through the tutorial and read more about what Turbo can do for you.
Read the full documentation at readthedocs.io.
Discussions about a Django/Hotwire integration are happening on the Hotwire forum. And on Slack, which you can join by clicking here!
As this new magic is discovered, you can expect to see a few repositories with experiments and demos appear in @hotwire-django. If you too are experimenting, we encourage you to ask for write access to the GitHub organization and to publish your work in a @hotwire-django repository.
Turbo-Django is released under the MIT License to keep compatibility with the Hotwire project.
If you submit a pull request. Remember to add yourself to CONTRIBUTORS.md
!