Автор: Артём Малышев · Moscow Python Conf 2016
⚠️ Материал 2016 года, Django Channels 1.x. Концептуальный разбор «зачем это нужно» остаётся актуальным. Детали API и конкретные паттерны с тех пор существенно изменились (Channels 2.x переписал архитектуру Channel Layer). Сверяйтесь с актуальной документацией.
Классический Django построен на WSGI — стандарте, появившемся в 2003 году. Его базовый контракт прост: принять запрос, вернуть ответ. Никакой асинхронности, никаких долгоживущих соединений. Это сознательный дизайн для эпохи, когда веб состоял из страниц с новостями и гостевых книг.
Современный веб хочет другого: живой контент без перезагрузки страницы, WebSocket-соединения, уведомления в реальном времени — пользователи не хотят нажимать F5. Django Channels — это ответ на этот запрос: расширение, добавляющее поддержку асинхронных протоколов поверх синхронного фреймворка.
Кому смотреть: Django-разработчикам, которым нужны WebSocket или long-polling, и которые хотят понять как Channels вписывается в Django-архитектуру — особенно где заканчивается синхронный Django и начинается async.
Из этого можно взять в работу: если добавляете real-time функциональность в Django-проект — поймите границу между синхронным Django (models, ORM, middleware) и async Channel Layer до того как начнёте писать код. Смешивать их без понимания этой границы — источник трудноуловимых проблем.
WSGI-сервер по определению не может удерживать соединение открытым: каждый запрос — отдельный вызов функции, которая возвращает результат и завершается. WebSocket требует противоположного — долгоживущего соединения, по которому сервер может отправлять данные в любой момент.
Django Channels решает это через ASGI (Asynchronous Server Gateway Interface) и Channel Layer — механизм обмена сообщениями между воркерами. Каждое соединение становится Consumer-ом, который получает и отправляет сообщения через Channel Layer, а не через прямой HTTP request-response цикл.
Малышев разбирает ключевой вопрос: как синхронная часть Django взаимодействует с асинхронной Channel Layer. Это граница, на которой легко ошибиться — и на которой стоит сосредоточиться при изучении Channels.