Рубрики
Без рубрики

Понимание каналов Django

Автор оригинала: Arun Ravindran.

Вы читаете пост из серии руководств, состоящей из двух частей, о каналах Django.

  • Часть 1
  • Часть 2

Каналы Django

Каналы Django изначально создавались для решения проблемы обработки асинхронных протоколов связи, например, WebSockets. Все больше и больше веб-приложений предоставляли возможности реального времени, такие как чат и push-уведомления. Были созданы различные обходные пути, чтобы заставить Django поддерживать такие требования, как запуск отдельных серверов сокетов или прокси-серверов.

Channels – официальный проект Django не только для обработки WebSockets и других форм двунаправленной коммуникации, но и для выполнения фоновых задач. асинхронно. На момент написания Django Channels 2 полностью переписан на основе сопрограмм Python 3, основанных на async/await.

В этой статье рассматриваются концепции каналов Django и приводится видеоруководство по реализации приложения уведомлений в Django.

Вот упрощенная блок-схема типичной настройки каналов:

Каналы Django

Как работает типичная инфраструктура Django Channels

Клиент, например веб-браузер, отправляет трафик HTTP/HTTPS и WebSocket на сервер ASGI, такой как Daphene. Как и WSGI, спецификация ASGI (интерфейс асинхронного серверного шлюза) – это распространенный способ асинхронного взаимодействия серверов приложений и приложений друг с другом.

Как и в типичном приложении Django, HTTP-трафик обрабатывается синхронно, то есть когда браузер отправляет запрос, он ждет, пока он не будет перенаправлен в Django и не будет отправлен ответ. Однако когда происходит трафик WebSocket, становится намного интереснее, потому что он может запускаться с любого направления.

Как только соединение WebSocket установлено, браузер может отправлять или получать сообщения. Отправленное сообщение достигает маршрутизатора типа протокола, который определяет следующий обработчик маршрутизации на основе своего транспортного протокола. Следовательно, вы можете определить маршрутизатор для HTTP, а другой – для сообщений WebSocket.

Эти маршрутизаторы очень похожи на преобразователи URL-адресов Django, но отображают входящие сообщения на потребителя (а не на представление). Потребитель похож на обработчик событий, который реагирует на события. Он также может отправлять сообщения обратно в браузер, тем самым обеспечивая логику полностью двунаправленной связи.

Потребитель – это класс, методы которого вы можете писать как обычные функции Python (синхронные) или как ожидаемые (асинхронные). Асинхронный код не следует смешивать с синхронным кодом. Итак, есть функции преобразования для преобразования из асинхронного в синхронизирующий и обратно. Помните, что части Django синхронны. Фактически, потребитель – это действующее приложение ASGI.

Пока что мы не использовали канальный слой. Как ни странно, вы можете писать приложения Channel без использования каналов! Но они не особенно полезны, поскольку между экземплярами приложений нет простого пути связи, кроме опроса базы данных. Каналы обеспечивают именно это – быстрый двухточечный и широковещательный обмен сообщениями между экземплярами приложений.

канал похож на трубу. Отправитель отправляет сообщение в этот канал с одного конца и достигает слушателя на другом конце. Группа определяет группу каналов, которые слушают определенную тему. Каждый потребитель прослушивает собственный автоматически сгенерированный канал, доступ к которому осуществляется с помощью его атрибута self.channel_name .

В дополнение к транспортам вы можете запустить потребителя, слушающего канал, отправив сообщение, тем самым запустив фоновую задачу. Это работает как очень быстрая и простая система фонового рабочего.

Пошаговое создание приложения каналов

В следующем скринкасте рассматривается создание приложения для уведомлений с использованием каналов Django. Вы можете получить доступ к коду на Github . К промежуточным проектам, таким как Echo Consumer, можно получить доступ как к веткам репозитория git.

Заметки шоу доступны на Github .

Посмотрите видеоурок и дайте мне знать, если вы нашли его полезным! Чтобы узнать больше, прочтите документацию по каналам Django .

Эта статья содержит отрывок из книги Аруна Равиндрана «Шаблоны дизайна и передовые методы Django».