Django AWS API Gateway WebSockets
Django AWS API Gateway WebSockets lets Django projects use AWS API Gateway WebSocket APIs without running a dedicated WebSocket server.
AWS API Gateway manages the WebSocket connection. Django receives API Gateway events as normal HTTP requests and can send messages back to connected clients through the AWS API Gateway Management API.
This project is designed for Django applications that want WebSocket-style features while keeping a traditional Django request/response deployment model.
Documentation
Full documentation is available on Read the Docs:
https://django-aws-api-gateway-websockets.readthedocs.io/
Useful starting points:
- Quickstart
- Concepts
- API Gateway setup
- Client integration
- Security
- WebSocket tokens
- Deployment
- Troubleshooting
Features
- Handle AWS API Gateway WebSocket events with Django class-based views.
- Track WebSocket connections in the Django database.
- Associate connections with Django users where available.
- Group connections using channels.
- Send messages to:
- one connection;
- all connections for a user;
- all connections in a channel;
- all connected clients.
- Create and manage API Gateway resources from Django Admin or management commands.
- Add custom API Gateway routes for different Django views.
- Use WebSocket tokens for authenticated connection protection.
- Rate limit WebSocket connection attempts.
- Restrict handlers using Django permissions.
- Use mixins to add WebSocket connection details to template context.
When to use this package
Use this package if you want:
- AWS API Gateway to manage WebSocket connections;
- Django to receive WebSocket events as HTTP requests;
- to avoid running a dedicated ASGI WebSocket server;
- to send messages from Django to connected browser clients;
- to group connections into channels for multicast messaging;
- to integrate WebSocket behaviour with existing Django models, views, admin, permissions, and management commands.
This package is not a replacement for Django Channels. Django Channels is a better fit if you want Django itself to run an ASGI WebSocket server.
Requirements
- Python 3.10+
- Django 5.2+
- AWS account with API Gateway permissions
- Boto3-compatible AWS credentials or IAM role
See the installation guide and AWS IAM setup guide for details.
Installation
Install from PyPI:
pip install django-aws-api-gateway-websockets
Add the app to INSTALLED_APPS:
INSTALLED_APPS += ["django-aws-api-gateway-websockets"]
Run migrations:
python manage.py migrate
See the full quickstart for a working example.
Minimal example
Add a Django URL route with a route slug:
from django.urls import path
from .views import ExampleWebSocketView
urlpatterns = [
path(
"ws/<slug:route>",
ExampleWebSocketView.as_view(),
name="example_websocket",
),
]
Create a WebSocket view:
from django.http import JsonResponse
from django_aws_api_gateway_websockets.views import WebSocketView
class ExampleWebSocketView(WebSocketView):
def default(self, request, *args, **kwargs):
self.websocket_session.send_message({})
return JsonResponse({"ok": True})
Create a WebSocket view:
from django.http import JsonResponse
from django_aws_api_gateway_websockets.views import WebSocketView
class ExampleWebSocketView(WebSocketView):
def default(self, request, *args, **kwargs):
self.websocket_session.send_message(
{
"type": "reply",
"message": "Hello from Django",
}
)
return JsonResponse({"ok": True})
Connect from the browser:
const socket = new WebSocket("wss://ws.example.com?channel=example");
socket.onmessage = function (event) {
const message = JSON.parse(event.data);
console.log("Received:", message);
};
socket.onopen = function () {
socket.send(JSON.stringify({
action: "default",
message: "Hello from the browser"
}));
};
For production usage, read the documentation on WebSocket tokens and security.
AWS setup
The package can create and configure API Gateway WebSocket resources using Django Admin actions or management commands. Typical setup steps:
- Configure AWS credentials or an IAM role.
- Create an record.
ApiGateway - Create the AWS API Gateway.
- Optionally create a custom domain.
- Configure DNS.
- Connect from your frontend client.
See the full API Gateway setup guide.
Management commands
The package includes management commands for API Gateway setup and cleanup.
python manage.py createApiGateway --pk=<api_gateway_pk>
python manage.py createCustomDomain --pk=<api_gateway_pk>
python manage.py clearWebSocketSessions
python manage.py cleanupWebSocketTokens
See the management commands documentation for details.
Security
Version 3.0.0 introduced significant security improvements, including:
- WebSocket token protection;
- single-use session-bound connection tokens;
- connection attempt rate limiting;
- handler whitelisting;
- Django permission checks;
- stricter input validation;
- channel name validation;
- message size validation;
- safer debug output;
- audit logging for admin actions.
For authenticated production WebSocket endpoints, read:
To report a vulnerability, see SECURITY.md.
Development
Clone the repository:
git clone https://github.com/StevenMapes/django-aws-api-gateway-websockets.git
cd django-aws-api-gateway-websockets
Install development requirements into your virtual environment. Run tests:
pip install pytest-django
coverage erase
python -W error::DeprecationWarning -W error::PendingDeprecationWarning -m coverage run --parallel -m pytest --ds tests.settings
coverage combine
coverage report
Build the documentation locally:
cd docs
pip install -r requirements.txt
make html
See the contributing guide for more information.
Changelog
See the changelog for release history.
License
This project is licensed under the MIT License. See LICENSE.
Metadata
Release files for django-aws-api-gateway-websockets 4.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| django_aws_api_gateway_websockets-4.1.0.tar.gz | 342.6 kB | Without provenance | Details for django_aws_api_gateway_websockets-4.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| django_aws_api_gateway_websockets-4.1.0-py3-none-any.whl | Python 3 | none | any | Details for django_aws_api_gateway_websockets-4.1.0-py3-none-any.whl |
Total release size: 407.5 kB
Release files / django_aws_api_gateway_websockets-4.1.0.tar.gz
| Download URL | django_aws_api_gateway_websockets-4.1.0.tar.gz |
|---|---|
| Size | 342.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
36f1ea79f492ca4b2465dafd012b14920b92a6a7d8ad938cafe8531c8597c127
|
|
BLAKE2b-256 checksum How to use checksums |
f24bdf89c5fd4344477cac6927f1c444977ac3d97e18c251a1a500d6652a3953
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.3
|
Release files / django_aws_api_gateway_websockets-4.1.0-py3-none-any.whl
| Download URL | django_aws_api_gateway_websockets-4.1.0-py3-none-any.whl |
|---|---|
| Size | 64.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
99844d411012f32795da6372c235212c74b12fc697d3fe756009981b3e8e0e9e
|
|
BLAKE2b-256 checksum How to use checksums |
5b5a29d4e809a55506c29d935d1efea3f294bbd270cf3a8ec3a2dcdfcf5a1aed
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.3
|
Security for django-aws-api-gateway-websockets 4.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.