Top.Mail.Ru

Создание WebSocket на Django

Создание WebSocket на Django

Для создания WebSocket-соединений в Django, чаще всего используют Django Channels, что позволяет работать с асинхронными протоколами, такими как WebSocket, поверх стандартного Django-приложения. 

Установка Django Channels

pip install channels


Настройка Django Channels
После установки добавьте `'channels'` в список приложений в `settings.py`
settings.py
INSTALLED_APPS = [
    # другие приложения
    'channels',
]

Укажите Channels в качестве бэкенда ASGI
ASGI_APPLICATION = 'your_project_name.asgi.application'

Настройка ASGI
Создайте файл `asgi.py` в корне проекта рядом с `wsgi.py`, если его еще нет
asgi.py
import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
import your_app_name.routing

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project_name.settings')

application = ProtocolTypeRouter({
    "http": get_asgi_application(),
    "websocket": AuthMiddlewareStack(
        URLRouter(
            your_app_name.routing.websocket_urlpatterns
        )
    ),
})

Создание маршрутов WebSocket
В приложении, например, `your_app_name`, создайте файл `routing.py` и добавьте маршруты для WebSocket:
your_app_name/routing.py
from django.urls import path
from . import consumers

websocket_urlpatterns = [
    path('ws/some_path/', consumers.YourConsumer.as_asgi()),
]


Создание Consumer для WebSocket
Создайте файл `consumers.py` в том же приложении. Здесь определяются действия при подключении, получении сообщений, и отключении:
your_app_name/consumers.py
import json
from channels.generic.websocket import AsyncWebsocketConsumer

class YourConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        await self.accept()

    async def disconnect(self, close_code):
        pass

    async def receive(self, text_data):
        text_data_json = json.loads(text_data)
        message = text_data_json['message']
        
        await self.send(text_data=json.dumps({
            'message': message
        }))

Подключение к WebSocket на клиенте
Чтобы протестировать WebSocket, подключитесь к нему с помощью JavaScript:
const socket = new WebSocket('ws://localhost:8000/ws/some_path/');

socket.onopen = function(event) {
    socket.send(JSON.stringify({'message': 'Hello, WebSocket!'}));
};

socket.onmessage = function(event) {
    const data = JSON.parse(event.data);
    console.log('Message from server:', data.message);
};

socket.onclose = function(event) {
    console.log('WebSocket is closed now.');
};
```


Запустите проект с помощью `daphne` для ASGI, так как стандартный `runserver` не поддерживает WebSocket:
daphne -p 8000 your_project_name.asgi:application

Автор:

46

Читайте также

0 комментариев