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, чтобы достичь функций чата в реальном времени.
*Редактирование: я думал, что вам нужны обратные знаки в каждой строке