Websocket не получает сообщение от сервера django channels, хотя они подключены
В настоящее время я создаю приложение с помощью django channels.
У меня есть вебсокет, подключенный к серверу. Если посмотреть на мой терминал, кажется, что websocket успешно подключен к серверу.
HTTP GET / 200 [0.01, 127.0.0.1:62087] HTTP GET /static/video/js/websocket.js 200 [0.00, 127.0.0.1:62087] WebSocket HANDSHAKING /ws/video [127.0.0.1:62089] WebSocket CONNECT /ws/video [127.0.0.1:62089]
Однако websocket не получает сообщение, отправленное с сервера.
Вот мои коды:
consumers.py
import json
from channels.generic.websocket import WebsocketConsumer
from asgiref.sync import async_to_sync
class VideoConsumer(WebsocketConsumer):
def connect(self):
self.accept()
self.send(json.dumps({'message': 'you are connected!'}))
websocket.js
const address = 'ws://' + window.location.host + '/ws/video'
const websocket = new WebSocket(address)
const btn = document.getElementById('myButton')
websocket.onopen = (event) => {
console.log('websocket connected!!!')
}
websocket.onmessage = (event) => {
console.log(event.data)
}
Я хотел бы получать сообщение "Вы подключены!" на консоли браузера. Я изучил официальный документ django channels и искал решение в google, но мне не удалось решить мою проблему. Что я здесь упускаю?
Проблема не имеет ничего общего с вышеприведенными кодами.
Я решил проблему путем редактирования моего asgi.py в папке проекта.
import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.security.websocket import AllowedHostsOriginValidator
from channels.auth import AuthMiddlewareStack
import video.routing
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'VideoChat.settings')
application = ProtocolTypeRouter(
{
'http': get_asgi_application(),
'websocket': AllowedHostsOriginValidator(
AuthMiddlewareStack(URLRouter(video.routing.websocket_urlpatterns))
)
}
)
Как вы можете видеть, я обернул AuthMiddlewareStack(URLRouter(video.routing.websocket_urlpatterns))
с помощью AllowedHostsOriginValidator
. После того, как я удалил AllowedHostsOriginValidator
, как 'websocket': AuthMiddlewareStack(URLRouter(video.routing.websocket_urlpatterns))
, проблема была решена идеально.
p.s: Я заметил, что вебсокет все еще может быть подключен с предыдущей настройкой. Он просто не отправляет и не получает сообщения от сервера.