Ответ
Django изначально построен на синхронной модели запрос-ответ (HTTP) и не поддерживает WebSockets "из коробки". Для их реализации требуется расширение фреймворка для работы с ASGI (Asynchronous Server Gateway Interface).
1. Django Channels
Это официальный и наиболее популярный способ добавить поддержку WebSockets и других долгоживущих соединений в Django.
Почему это стандарт де-факто:
- Полная интеграция с Django: Использует знакомые компоненты, включая аутентификацию и сессии.
- Поддержка ASGI: Превращает Django в ASGI-приложение, способное работать с серверами вроде
DaphneилиUvicorn. - Гибкая маршрутизация: Позволяет направлять WebSocket-соединения на специальные обработчики — консьюмеры.
- Дополнительные возможности: Включает поддержку "каналов" и "групп" для широковещательных сообщений (broadcast).
Пример простого консьюмера:
# chat/consumers.py
import json
from channels.generic.websocket import AsyncWebsocketConsumer
class ChatConsumer(AsyncWebsocketConsumer):
async def connect(self):
# Принимаем WebSocket-соединение
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': f"You said: {message}"
}))
2. dwebsocket
Более старая и простая библиотека, которая реализует WebSockets поверх стандартного WSGI с помощью декораторов.
Особенности:
- Простота: Легко добавить в существующий проект для базовых задач.
- Ограничения: Менее гибкая, чем Channels, и не так хорошо подходит для сложных приложений с высокой нагрузкой. Не является полноценным ASGI-решением.
Пример:
# views.py
from dwebsocket.decorators import accept_websocket
@accept_websocket
def echo_socket(request):
if not request.is_websocket():
# Обработка обычного HTTP-запроса
return HttpResponse('This is a websocket endpoint.')
else:
for message in request.websocket:
request.websocket.send(message) # Отправляем эхо-ответ
Рекомендация
Для всех новых и серьезных проектов следует использовать Django Channels. Это мощное, поддерживаемое и масштабируемое решение. dwebsocket может рассматриваться только для очень простых или легаси-проектов.