WebSocket-соединение с 'url' не удалось
Я только что развернул проект django, который использует каналы djagno в heroku.
Когда я пытаюсь создать вебсокетное соединение через форму http://localhost:3000/ с url, я получаю ошибку соединения с вебсокетами.
Является ли это следствием неправильного развертывания или чего-то еще, я не могу понять, может ли кто-нибудь помочь мне...
Вот как я подключаюсь к websocket
useEffect(() => {
Socket = new WebSocket(`${WEBSOCKET_URL}/room/${roomName}/${myUserName}/`);
Socket.onmessage = ({ data }) => {
let res = JSON.parse(data);
if (!res.error && res["data-type"] === "begin-game") {
const { gameId } = res;
Socket.close();
navigate(`/game/${gameId}/`, {
state: { gameId, data: res.data, myUserName },
});
} else if (!res.error) setUsersOnRoom({ ...res.data });
};
}, []);
где WEBSOCKET_URL равен export const WEBSOCKET_URL = "wss://ludo-thegameforlegends.herokuapp.com/ws";
Коды в моем проекте django следующие
в asgi.py
import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter,URLRouter
from channels.auth import AuthMiddlewareStack
from main.routing import websocket_urlpatterns as room_urlpatters
from gameManager.routing import websocket_urlpatterns as gameManager_urlpatterns
from channels.security.websocket import AllowedHostsOriginValidator
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ludo.settings')
websocket_urlpatterns = room_urlpatters + gameManager_urlpatterns
application = ProtocolTypeRouter({
'http':get_asgi_application(),
'websocket':AllowedHostsOriginValidator(AuthMiddlewareStack(URLRouter(websocket_urlpatterns))),
})
Я настраиваю канальные слои следующим образом
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels_redis.core.RedisChannelLayer",
"CONFIG": {
"hosts": [(os.environ.get('REDIS_URL'), 6379)],
},
},
}
маршрутизация выглядит следующим образом...
from django.urls import path
from .consumers import room_consumer
websocket_urlpatterns = [
path('ws/room/<str:roomName>/<str:userName>/',room_consumer.as_asgi()),
]
и это мои потребители
import json
from .models import Room
from gameManager.models import GameInstance
from asgiref.sync import async_to_sync
from .serializers import RoomSerializer
from channels.generic.websocket import WebsocketConsumer
from .utils import changeUserInDatabase,setDisconnectingUserToNoneInDatabase
class room_consumer(WebsocketConsumer):
def connect(self):
self.accept()
self.room_group_name = self.scope['url_route']['kwargs']['roomName']
self.user_name = self.scope['url_route']['kwargs']['userName']
async_to_sync(self.channel_layer.group_add)(self.room_group_name,self.channel_name)
room = Room.objects.get(name=self.room_group_name)
if not room.nameExists(self.user_name):
room,userColor = changeUserInDatabase(self.room_group_name,self.user_name)
self.color = userColor
user_list = RoomSerializer(room).data
async_to_sync(self.channel_layer.group_send)(self.room_group_name,{'type':'broadcast','error':None,'data-type':'user-joined-or-disconnected','data':user_list})
и вот что показывают журналы heroku
2022-06-25T06:10:09.516891+00:00 app[web.1]: 10.1.56.26 - - [25/Jun/2022:06:10:09 +0000] "POST /api/create-or-verify/ HTTP/1.1" 200 54 "http://localhost:3000/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36"
2022-06-25T06:10:09.515137+00:00 heroku[router]: at=info method=POST path="/api/create-or-verify/" host=ludo-thegameforlegends.herokuapp.com request_id=7d47025d-6589-407b-81a1-094184123a43 fwd="27.34.26.234" dyno=web.1 connect=0ms service=5ms status=200 bytes=410 protocol=https
2022-06-25T06:10:11.282950+00:00 app[web.1]: Not Found: /ws/room/asdf/ghhhjh/
2022-06-25T06:10:11.283285+00:00 app[web.1]: 10.1.30.202 - - [25/Jun/2022:06:10:11 +0000] "GET /ws/room/asdf/ghhhjh/ HTTP/1.1" 404 2262 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36"
2022-06-25T06:10:11.284165+00:00 heroku[router]: at=info method=GET path="/ws/room/asdf/ghhhjh/" host=ludo-thegameforlegends.herokuapp.com request_id=a453dbc3-f64d-4598-8123-256ff300ab4d fwd="27.34.26.234" dyno=web.1 connect=0ms service=4ms status=404 bytes=2582 protocol=https
2022-06-25T06:10:12.129139+00:00 heroku[router]: at=info method=GET path="/ws/room/asdf/ghhhjh/" host=ludo-thegameforlegends.herokuapp.com request_id=7b668aa1-e9fa-45b6-ab76-601ea563d62c fwd="27.34.26.234" dyno=web.1 connect=0ms service=6ms status=404 bytes=2582 protocol=https
2022-06-25T06:10:12.128284+00:00 app[web.1]: Not Found: /ws/room/asdf/ghhhjh/
2022-06-25T06:10:12.128987+00:00 app[web.1]: 10.1.16.221 - - [25/Jun/2022:06:10:12 +0000] "GET /ws/room/asdf/ghhhjh/ HTTP/1.1" 404 2262 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36"
2022-06-25T06:07:06.000000+00:00 app[heroku-redis]: source=REDIS addon=redis-sinuous-30846 sample#active-connections=1 sample#load-avg-1m=0.25 sample#load-avg-5m=0.3 sample#load-avg-15m=0.36 sample#read-iops=0 sample#write-iops=0 sample#memory-total=15618680kB sample#memory-free=10552720kB sample#memory-cached=2820572kB sample#memory-redis=333744bytes sample#hit-rate=1 sample#evicted-keys=0