无法在 React JS 和 Django 频道之间建立连接
Can't establish connection between React JS & Django Channels
我有一个使用 Django Rest Framework 和 React 的网络应用程序。我正在尝试向其中添加网络套接字。我选择了 Django 频道,因为它们是最受推荐的。
但是,我不断收到此错误 Firefox 无法在 ws://localhost:3000/ws/canvas_data 建立与服务器的连接,然后是套接字自动关闭。
显然,无法在前端和后端之间保持连接。我在路由 URL 中尝试了几个选项,但没有任何效果。
也许问题出在端口上,因为 HTTP 和 ws 使用了相同的端口。
这是我第一次使用 Django Channels,所以请原谅我的知识不足。
这是消费者:
from channels.generic.websocket import WebsocketConsumer, AsyncWebsocketConsumer
from time import sleep
import json
class WSConsumer(AsyncWebsocketConsumer):
async def connect(self):
print("CONNECTION IS NOW OPEN !!")
await self.accept()
for i in range(20): #The logic should be here, this is just an example to test
await self.send(json.dumps({"nom_rapport": "pv"}))
sleep(1)
async def disconnect(self, message):
print("CONNECTION IS NOW CLOSED !!")
pass
asgi.py配置:
import os
from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application
from django.urls import path
from Dashboard.consumers import WSConsumer
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Dashboard_sise.settings')
application = ProtocolTypeRouter({
'http': get_asgi_application(),
'websocket': URLRouter([
path(r'ws/canvas_data/', WSConsumer.as_asgi()),
])
})
settings.py 文件:
INSTALLED_APPS = [
.....
'channels',
'rest_framework',
.....
]
WSGI_APPLICATION = 'Dashboard_sise.wsgi.application'
ASGI_APPLICATION = 'Dashboard_sise.asgi.application'
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels_redis.core.RedisChannelLayer",
"CONFIG": {
"hosts": ['redis://localhost:6379']
}
},
}
WebSocket 声明如下:
componentDidMount(){
var socketPath = 'ws://localhost:3000/ws/canvas_data';
const Socket = new WebSocket(socketPath);
Socket.onopen = () => {
console.log('Socket is connected');
}
Socket.onmessage = (e) => { //Logic will be placed here
console.log("MESSAGE :", e.data);
this.setState({messages: e.data});
};
Socket.onclose = (e) => {
console.error('Chat socket closed unexpectedly');
};
}
前端运行在3000端口,后端在8000端口
提前致谢。
您必须启动一个支持套接字的服务器,例如 daphne
daphne -b 0.0.0.0 -p 8001 django_project.asgi:application
我有一个使用 Django Rest Framework 和 React 的网络应用程序。我正在尝试向其中添加网络套接字。我选择了 Django 频道,因为它们是最受推荐的。
但是,我不断收到此错误 Firefox 无法在 ws://localhost:3000/ws/canvas_data 建立与服务器的连接,然后是套接字自动关闭。 显然,无法在前端和后端之间保持连接。我在路由 URL 中尝试了几个选项,但没有任何效果。 也许问题出在端口上,因为 HTTP 和 ws 使用了相同的端口。
这是我第一次使用 Django Channels,所以请原谅我的知识不足。
这是消费者:
from channels.generic.websocket import WebsocketConsumer, AsyncWebsocketConsumer
from time import sleep
import json
class WSConsumer(AsyncWebsocketConsumer):
async def connect(self):
print("CONNECTION IS NOW OPEN !!")
await self.accept()
for i in range(20): #The logic should be here, this is just an example to test
await self.send(json.dumps({"nom_rapport": "pv"}))
sleep(1)
async def disconnect(self, message):
print("CONNECTION IS NOW CLOSED !!")
pass
asgi.py配置:
import os
from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application
from django.urls import path
from Dashboard.consumers import WSConsumer
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Dashboard_sise.settings')
application = ProtocolTypeRouter({
'http': get_asgi_application(),
'websocket': URLRouter([
path(r'ws/canvas_data/', WSConsumer.as_asgi()),
])
})
settings.py 文件:
INSTALLED_APPS = [
.....
'channels',
'rest_framework',
.....
]
WSGI_APPLICATION = 'Dashboard_sise.wsgi.application'
ASGI_APPLICATION = 'Dashboard_sise.asgi.application'
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels_redis.core.RedisChannelLayer",
"CONFIG": {
"hosts": ['redis://localhost:6379']
}
},
}
WebSocket 声明如下:
componentDidMount(){
var socketPath = 'ws://localhost:3000/ws/canvas_data';
const Socket = new WebSocket(socketPath);
Socket.onopen = () => {
console.log('Socket is connected');
}
Socket.onmessage = (e) => { //Logic will be placed here
console.log("MESSAGE :", e.data);
this.setState({messages: e.data});
};
Socket.onclose = (e) => {
console.error('Chat socket closed unexpectedly');
};
}
前端运行在3000端口,后端在8000端口
提前致谢。
您必须启动一个支持套接字的服务器,例如 daphne
daphne -b 0.0.0.0 -p 8001 django_project.asgi:application