// the find
django/channels
Developer-friendly asynchrony for Django
Channels is the official Django extension for WebSockets, long-polling, and other async protocols, letting you write consumers alongside your regular views and models. It's for Django shops that need real-time features (chat, notifications, live dashboards) without leaving the Django ecosystem for something like FastAPI.
Consumers mirror Django's class-based view patterns, so the mental model transfers directly instead of requiring a separate async framework. The channel layer abstraction (in-memory for dev, Redis via channels_redis for production) cleanly decouples routing from transport, and swapping backends is a config change, not a rewrite. Testing utilities (WebsocketCommunicator, ApplicationCommunicator) are built in rather than bolted on, which is rare for async libraries this size. It's a first-party Django project with an actual deprecation policy, not a random third-party package that might vanish.
Maintenance is explicitly best-effort outside security fixes, per the README itself — worth knowing before betting production infrastructure on it. Anything beyond a single process needs Redis as a channel layer, so you're adding an infra dependency the moment you scale past one worker. The sync/async boundary is a real trap: ORM calls inside consumers need database_sync_to_async wrapping, and it's easy to accidentally block the event loop if you forget. Compared to frameworks built async-first (Starlette, FastAPI), Channels still feels like async grafted onto a synchronous core, which shows up in occasional rough edges around middleware and session handling.