Сбой WebSocket-соединения Django-channels
Я пытаюсь создать приложение на основе сокетов, используя Django-Channels, но у меня возникла проблема с подключением к WebSocket. Для демонстрации проблемы я создал тестовый проект.
Сообщение об ошибке из JS-консоли:
WebSocket соединение с 'ws://127.0.0.1:8000/' не удалось:
Ошибка возникает в строке 25 html-файла, где создается экземпляр WebSocket()
Вот код:
# consumers.py
import ...
class ChatConsumer(AsyncJsonWebsocketConsumer):
async def connect(self):
self.groupname = 'dashboard'
await self.channel_layer.group_add(
self.groupname,
self.channel_name,
)
await self.accept()
...
# routing.py
import...
websocket_urlpatterns = [
path("", ChatConsumer.as_asgi()),
]
# views.py
import ...
def chatPage(request, *args, **kwargs):
context = {}
return render(request, "chatPage.html", context)
# asgi.py
import ...
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ChatApp.settings')
application = ProtocolTypeRouter(
{
"http": get_asgi_application(),
"websocket": AuthMiddlewareStack(
URLRouter(
routing.websocket_urlpatterns
)
)
}
)
# settings.py
...
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels.layers.InMemoryChannelLayer"
}
}
...
<!--chatPage.html-->
...
<script>
const chatSocket = new WebSocket("ws://" + window.location.host + "/");
document.querySelector("#id_message_send_input").focus();
document.querySelector("#id_message_send_input").onkeyup = function (e) {
if (e.keyCode === 13) {
document.querySelector("#id_message_send_button").click();
}
};
document.querySelector("#id_message_send_button").onclick = function (e) {
const messageInput = document.querySelector(
"#id_message_send_input"
).value;
chatSocket.send(JSON.stringify({ message: messageInput, username : "{{request.user.username}}"}));
};
chatSocket.onmessage = function (e) {
const data = JSON.parse(e.data);
const div = document.createElement("div");
div.innerHTML = data.username + " : " + data.message;
document.querySelector("#id_message_send_input").value = "";
document.querySelector("#id_chat_item_container").appendChild(div);
};
</script>
...
После некоторых исследований я обнаружил, что слои канала могут работать неправильно, но я не уверен, так ли это, и если да, то хотел бы знать, как это исправить.
P.S. В настоящее время я работаю на windows, поэтому я не использую redis, но я не уверен, что та же проблема не появится, когда я перейду на redis.
Для меня понижение пакета django channels, похоже, сработало.
pip uninstall channels
pip install channels==3.0.5
Каналы 4.0.0 не запускают ASGI-сервер по умолчанию.
Если вы посмотрите на свои журналы запуска сервера, вы, вероятно, увидите:
Starting development server at http://0.0.0.0:8000/
Попробуйте добавить 'daphne' в INSTALLED_APPS в settings.py.
Теперь, когда ваш сервер запускается, вы должны увидеть что-то вроде:
Starting ASGI/Daphne version 4.0.0 development server at http://0.0.0.0:8000/
Для получения дополнительной информации смотрите примечания к выпуску Channels 4.0.0 - https://channels.readthedocs.io/en/stable/releases/4.0.0.html?highlight=INSTALLED_APPS#release-notes
Это сработало для меня и означает, что вам не нужно переходить на старую версию Channels.