Для создания 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
Автор: Евгений Морковин
0 комментариев