Django Signals¶
Django Bolt supports optional Django signal emission for compatibility with Django ecosystem features that depend on request_started and request_finished signals.
For more information on Django signals, see the Django Signals documentation.
Why Signals Are Optional¶
Django Bolt is designed for maximum performance. Django's signal system adds overhead to every request, which matters for high-throughput APIs. Django Bolt disables signals by default to eliminate this overhead.
Enabling Signals¶
Add to your Django settings:
When You Need Signals¶
Database Connection Management¶
Django Bolt disables signals by default, which means Django's automatic connection cleanup doesn't run. For async applications, Django recommends using connection pooling instead of relying on signals.
Recommended: Use connection pooling (no signals needed)
See Database connections in the deployment guide for setup instructions.
Alternative: Enable signals for CONN_MAX_AGE
If you need Django's timed connection recycling:
# settings.py
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
"NAME": "mydb",
"CONN_MAX_AGE": 600, # Close connections after 600s idle
"CONN_HEALTH_CHECKS": True, # Verify connections before use
}
}
BOLT_EMIT_SIGNALS = True # Required for CONN_MAX_AGE to work!
Django's request_finished signal triggers close_old_connections() which checks CONN_MAX_AGE and closes stale connections.
Third-Party Packages¶
Some Django packages rely on signals:
- django-debug-toolbar - Uses signals for request tracking
- django-silk - Profiling middleware uses signals
- Custom audit logging - May hook into request signals
If you use such packages, enable signals:
Summary¶
| Setting | Performance | Use Case |
|---|---|---|
BOLT_EMIT_SIGNALS=False (default) |
Maximum | Most APIs with connection pooling |
BOLT_EMIT_SIGNALS=True |
Slight overhead | Need CONN_MAX_AGE, debug tools, signal receivers |
Rule of thumb: Use connection pooling and keep signals disabled unless you have a specific reason to enable them.