ValueError: Django может обрабатывать только ASGI/HTTP-соединения, но не websocket

Я постараюсь очень подробно объяснить, в чем заключается моя проблема и как устроен проект. Я хочу сделать приложение для чата в реальном времени. На данный момент в моем проекте есть:

SignupLoginApp ProgettoDiGruppo (Главное приложение) Главная ChatManagement(Websocket app). Проблема в том, что я не могу запустить Websocket, а поскольку это мой первый раз, я не очень понимаю, что делаю.

Вот мой файл ProgettoDiGruppo.settings.py:

INSTALLED_APPS = [`
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # ThirdParty
    'crispy_forms',
    'crispy_bootstrap4',
    'channels',
    # MyApp
    'SignupLoginApp.apps.SignupappConfig',
    'Home.apps.HomeConfig',
    ChatManagement.apps.ChatmanagementConfig'
]
WSGI_APPLICATION = 'ProgettoDiGruppo.wsgi.application'
ASGI_APPLICATION = 'ProgettoDiGruppo.routing.application'

CHANNEL_LAYERS = {
    default': {
        "BACKEND": "channels.layers.InMemoryChannelLayer",
    }
}

Вот мой ProgettoDiGruppo.routing.py

from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
import ChatManagement.routing


websocket_urlpatterns = [

]

application = ProtocolTypeRouter({
    'websocket': AuthMiddlewareStack(
        URLRouter(`
            ChatManagement.routing.websocket_urlpatterns
        )
    ),
})

Это мой ChatManagement.routing.py

`from django.urls import re_path

from ChatManagement import consumers

websocket_urlpatterns = [ re_path(r'/ws/chat/(?P<room_name>\w+)/$', consumers.ChatConsumer.as_asgi()), ]`

ChatMAnagement.consumers.py

import json
from channels.generic.websocket import AsyncWebsocketConsumer


class ChatConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        self.room_name = self.scope['url_route']['kwargs']['room_name']
        self.room_group_name = 'chat_%s' % self.room_name
        await self.channel_layer.group_add(
            self.room_group_name,
            self.channel_name
        )
        await self.accept()

        await self.channel_layer.group_send(
            self.room_group_name,
            {
                'type': 'chat_message',
                'message': self.scope['user'].username
            }
        )

    async def chat_message(self, event):
        # This method will be called when a 'chat_message' event is received
        message = event['message']
        # Send the message to the WebSocket
        await self.send(text_data=message)

    async def disconnect(self, close_code):
        await self.channel_layer.group_discard(
            self.room_group_name,
            self.channel_name
        )

Это журнал django после того, как я запустил ./manage.py runserver

Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
April 10, 2024 - 00:28:29
Django version 5.0.4, using settings 'ProgettoDiGruppo.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Это команда daphne, которую я запускаю daphne -p 8001 ProgettoDiGruppo.asgi:application

Я выбираю 8001, потому что 8000 уже занят веб-сервером

daphne выдает такой лог, когда я пытаюсь запустить js для подключения к websocket:

127.0.0.1:60038 - - [10/Apr/2024:00:31:45] "WSCONNECTING /ws/chat/fffd/" - -
2024-04-10 00:31:46,000 ERROR    Exception inside application: Django can only handle ASGI/HTTP connections, not websocket.
Traceback (most recent call last):
  File ".venv/lib/python3.10/site-packages/django/core/handlers/asgi.py", line 165, in __call__
    raise ValueError(
ValueError: Django can only handle ASGI/HTTP connections, not websocket.
127.0.0.1:60038 - - [10/Apr/2024:00:31:46] "WSDISCONNECT /ws/chat/fffd/" - -

В то же время я не получаю ошибок в журнале Django, который выдает мне следующее:

[10/Apr/2024 00:31:45] "GET /home/chat/fffd/ HTTP/1.1" 200 3571
[10/Apr/2024 00:31:45] "GET /static/js/websocket.js HTTP/1.1" 304 0

И, наконец, вот js-код для WebSocket-соединения

chatSocket.onmessage = function (evt) {
    const data = JSON.parse(evt.data)
    console.log(data)
}

Я хочу получить Websocket Working, чтобы достичь функций чата в реальном времени.

*Редактирование: я думал, что вам нужны обратные знаки в каждой строке

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