Введение
WebSocket API — это надстройка над протоколом HTTP, позволяющая установить постоянное двустороннее соединение между сервером и клиентом, что обеспечивает передачу данных в режиме реального времени.
В этой статье мы рассмотрим создание WebSocket API на Django, популярном фреймворке разработки веб-приложений на языке Python.
Шаг 1: Установка Django Channels
Для работы с WebSocket API на Django нам понадобится установить Django Channels. Установить его можно с помощью команды:
pip install channels
После этого необходимо добавить Channels в INSTALLED_APPS в файле settings.py:
INSTALLED_APPS = [
...
'channels',
...
]
Шаг 2: Создание consumer’а
Consumer в Django Channels — это обработчик, который принимает и обрабатывает сообщения от клиента. Создадим файл consumer.py и добавим в него следующий код:
from channels.generic.websocket import WebsocketConsumer
class MyConsumer(WebsocketConsumer):
def connect(self):
self.accept()
def disconnect(self, close_code):
pass
def receive(self, text_data):
self.send(text_data="You said: " + text_data)
Шаг 3: Создание маршрутов
Маршруты в Django Channels определяют, какие consumer’ы должны обрабатывать входящие соединения. Создадим файл routing.py и добавим следующий код:
from django.urls import path
from . import consumer
websocket_urlpatterns = [
path('ws/myapi/', consumer.MyConsumer.as_asgi()),
]
Также необходимо добавить указатель на маршруты в файл asgi.py:
from django.urls import path
from . import consumer
websocket_urlpatterns = [
path('ws/myapi/', consumer.MyConsumer.as_asgi()),
]
Шаг 4: Настройка сервера
Для использования WebSocket API необходимо настроить сервер. Добавьте следующие строки в файл settings.py:
ASGI_APPLICATION = 'myproject.routing.application'
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels.layers.InMemoryChannelLayer',
},
}
Шаг 5: Подключение JavaScript клиента
Для работы с WebSocket API с помощью JavaScript клиента добавьте следующий код в ваш файл JavaScript:
const socket = new WebSocket('ws://' + window.location.host + '/ws/myapi/');
socket.onopen = function(e) {
console.log('WebSocket connection established.');
}
socket.onmessage = function(event) {
const message = event.data;
console.log('Received message: ' + message);
}
socket.onclose = function(event) {
console.log('WebSocket connection closed.');
}
function sendMessage() {
const message = document.getElementById('message-input').value;
socket.send(message);
console.log('Sent message: ' + message);
}
Заключение
В этой статье мы рассмотрели, как создать WebSocket API на Django с использованием Django Channels. Теперь вы можете использовать WebSocket для реализации реального времени в вашем веб-приложении.
Шаг за шагом настройка Django проекта для работы с WebSocket
Шаг 1: Установка Django Channels
Первым делом необходимо установить Django Channels, добавив его в зависимости вашего проекта. Выполните команду:
pip install channels
Шаг 2: Настройка ASGI сервера
Для работы с WebSocket требуется использование ASGI сервера. Один из таких серверов — Daphne, который входит в комплект поставки Django Channels. Добавьте следующий код в файл asgi.py в корневой директории вашего проекта:
import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
from myapp import routing
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
application = ProtocolTypeRouter({
'http': get_asgi_application(),
'websocket': URLRouter(routing.websocket_urlpatterns),
})
Шаг 3: Настройка маршрутов WebSocket
Создайте файл routing.py в директории вашего приложения. В нем определите маршруты WebSocket API:
from django.urls import re_path
from . import consumers
websocket_urlpatterns = [
re_path(r'ws/chat/(?P\w+)/$', consumers.ChatConsumer.as_asgi()),
]
Шаг 4: Создание WebSocket consumer
Создайте файл consumers.py в директории вашего приложения. В нем определите WebSocket consumer для обработки входящих сообщений:
import asyncio
from channels.generic.websocket import AsyncWebsocketConsumer
class ChatConsumer(AsyncWebsocketConsumer):
async def connect(self):
self.room_name = self.scope['url_route']['kwargs']['room_name']
self.room_group_name = 'chat_%s' % self.room_name
await self.channel_layer.group_add(
self.room_group_name, self.channel_name
)
await self.accept()
...
...
...
Шаг 5: Настройка URL маршрутизации
В файле urls.py вашего проекта добавьте маршрут для websocket URL:
from django.urls import path
from myapp import views
urlpatterns = [
...
path('ws/chat//', views.chat_room, name='chat_room'),
]
Шаг 6: Обработка WebSocket запросов
Создайте в вашем приложении файл views.py и определите функцию chat_room для обработки WebSocket запросов:
from django.shortcuts import render
def chat_room(request, room_name):
return render(request, 'chat/room.html', {
'room_name': room_name
})
Готово! Теперь вы готовы к разработке WebSocket API на Django с использованием Django Channels.