В этой статье мы рассмотрим основы работы с библиотекой channels для Python Django, которая работает с WebSocket и конечно будут примеры.
Также если вас интересует работа с WebSocket, то прочитайте эти две статьи:
Как установить Django channels:
Первым делом как всегда нужно установить библиотеку, для этого как обычно на Python используем PIP.
1 | python -m pip install -U channels |
Теперь в список INSTALLED_APPS
который находится в «settings.py», добавьте надпись channels
.
1 2 3 4 5 6 7 8 | INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', ... 'channels', ) |
Также в настройки нужно добавить не большую переменную, которая будет обозначать где находится роутингом.
1 | ASGI_APPLICATION = "myproject.routing.application" |
Также создайте вашей главной папке проекта файл «routing.py», эта и есть настройка для WebSocket, туда мы и направляли переменную выше, вот что там должно быть.
1 2 3 4 5 | from channels.routing import ProtocolTypeRouter application = ProtocolTypeRouter({ # Пока пусто (http-> django views добавлены по умолчанию) }) |
На этом установка заканчивается.
Базовая работа с Django channels:
Теперь перейдём к самой работе с этой библиотекой, но тут стоит сказать, что это скорее не большой перевод обучения с официальной документации.
В качестве примера мы будем сделаем не большой чат, и весь код будет хранится в приложение «chat», но я не буду тут показывать все шаблоны и весь код чата, а только ту часть за которую отвечает channels, сам чат будет в одной из будущих статей.
Если у вас еще нет проекта и приложения Django, вам нужно будет его создать, для этого можете посмотреть статью «Быстрый старт на Django».
После того как всё создали, добавляем в папку с настройками файл «routing.py», в нём пишем вот это.
1 2 3 4 5 6 7 8 9 10 11 | from channels.auth import AuthMiddlewareStack from channels.routing import ProtocolTypeRouter, URLRouter import chat.routing application = ProtocolTypeRouter({ 'websocket': AuthMiddlewareStack( URLRouter( chat.routing.websocket_urlpatterns ) ), }) |
Тут мы по сути добавляем файл «routing.py», который находится в папке приложения, если кратко говоря, то это аналог файла «urls.py».
Теперь создадим этот файл в приложение «chat», там будет весь основной код.
1 2 3 4 5 6 7 | from django.urls import re_path from . import consumers websocket_urlpatterns = [ re_path(r'ws/chat/(?P<room_name>\w+)/$', consumers.ChatConsumer), ] |
То есть это аналог «urls.py», в нём назначается путь куда нужно отправлять WS для работы в Django 3 WebSocket, и какой класс использовать для их обработки.
Сам же класс будем писать во файле «consumers.py», который находится в папке с приложением, вот что будет внутри его.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import json from channels.generic.websocket import WebsocketConsumer class ChatConsumer(WebsocketConsumer): def connect(self): self.accept() def disconnect(self, close_code): pass def receive(self, text_data): text_data_json = json.loads(text_data) message = text_data_json['message'] self.send(text_data=json.dumps({ 'message': message })) |
То есть в этом файле, в начале мы подключаем все нужные компоненты, самое главное это json, так как, отправлять клиенту мы будем именно json данные.
В классе ChatConsumer
, который мы унаследовали с WebsocketConsumer
, первый же метод у нас connect()
, и как понятно из названию, он что то делает во время подключения к серверу через WS, второй метод disconnect()
описывает действия при отключения от сервера, последние это receive()
, как правела в ней отправляются данные всем пользователям, для отправки используется метод send()
.
Это пожалуй самое главное что стоит знать про эту библиотеку, в остальном просто нужно внутри этих методов писать нужный вам код, вот и всё.
Примеры как можно использовать:
Ну самое главное для чего можно использовать эту библиотеку, так это для создания чатов или даже социальных сетей.
Второе, это для браузерных многопользовательских игр, тоже очень хорошо для этого подойдёт.
Вывод:
В этой статье вы прочитали как работать библиотекой Django channels, где были примеры, как можно это использовать, если вас она заинтересовала, то посмотрите документацию.