Как создать WebSocket API на Django

Введение

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.

Оцените статью