Сбой 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.

Вернуться на верх