Django Channels 消费者未连接到 websocket
Django Channels Consumer Not Connecting to websocket
我在客户端创建了一个带有 javascripts 的 websocket...然后设置我的项目来处理 webocket 连接,如下所示(遵循官方 django-channels 文档)。但是每次我刷新页面并从浏览器控制台观看 websocket 时……它都失败了。我在消费者 class 的 init 中插入了一个打印语句并打印了它(每次访问或刷新包含 websocket 的页面时)..这意味着路由工作正常......但由于某些原因,消费者没有 connecting/accepting 与 websocket 的预期连接。并且在开发服务器中也没有关于任何 websocket 连接的日志 process.Please 任何人都可以提供帮助并提出修复建议。
python-版本 - 3.9.9,
django 版本 - 3.2.9,
频道版本 - 3.0.4
我的setting.py文件(相关行)
INSTALLED_APPS = [
...
'channels',
]
ASGI_APPLICATION = 'ma_mall.asgi.application'
CHANNEL_LAYERS = {
"default": {
'BACKEND': "channels_redis.core.RedisChannelLayer",
"CONFIG": {
'hosts': [('127.0.0.1', 6379)],
}
}
}
我的asgi.py文件
application = ProtocolTypeRouter({
"http": get_asgi_application(),
"websocket": URLRouter(
routing.websocket_urlpatterns
)
})
我的routing.py文件
websocket_urlpatterns = [
path("ws/notifications/", consumers.NotificationConsumer.as_asgi()),
]
我的消费档案
class NotificationConsumer(AsyncJsonWebsocketConsumer):
groups = ['general_group']
async def connect(self):
await self.accept()
await self.channel_layer.group_add('notification_group', self.channel_name)
await self.channel_layer.group_send('notification_group',
{
'type': 'tester.message',
'tester': 'tester'
}
)
async def disconnect(self, close_code):
await self.channel_layer.group_discard('notification_group', self.channel_name)
客户端的 websocket javascript
我在客户端使用 javascript 创建为 websocket,如下所示
const notification_websocket = new WebSocket(
'ws://' +
window.location.host +
'/ws/notifications/'
);
notification_websocket.onmessage = function (e) {
let data = JSON.parse(e.data);
console.log("Just received this from the back end.. 0", data);
}
notification_websocket.onclose = function (e) {
console.log("websocket closed");
}
我意识到我使用了旧版本的 Redis(在 Windows 上使用 redis)并且问题恰好来自配置的 redis 部分。一旦我从使用 Redis 切换到使用 Memcache
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels.layers.InMemoryChannelLayer"
}
}
websocket-consumer 连接已连接并按预期保持打开...我希望找到在 Windows 上使用 Redis 更新版本进行开发的解决方案
我在客户端创建了一个带有 javascripts 的 websocket...然后设置我的项目来处理 webocket 连接,如下所示(遵循官方 django-channels 文档)。但是每次我刷新页面并从浏览器控制台观看 websocket 时……它都失败了。我在消费者 class 的 init 中插入了一个打印语句并打印了它(每次访问或刷新包含 websocket 的页面时)..这意味着路由工作正常......但由于某些原因,消费者没有 connecting/accepting 与 websocket 的预期连接。并且在开发服务器中也没有关于任何 websocket 连接的日志 process.Please 任何人都可以提供帮助并提出修复建议。
python-版本 - 3.9.9, django 版本 - 3.2.9, 频道版本 - 3.0.4
我的setting.py文件(相关行)
INSTALLED_APPS = [
...
'channels',
]
ASGI_APPLICATION = 'ma_mall.asgi.application'
CHANNEL_LAYERS = {
"default": {
'BACKEND': "channels_redis.core.RedisChannelLayer",
"CONFIG": {
'hosts': [('127.0.0.1', 6379)],
}
}
}
我的asgi.py文件
application = ProtocolTypeRouter({
"http": get_asgi_application(),
"websocket": URLRouter(
routing.websocket_urlpatterns
)
})
我的routing.py文件
websocket_urlpatterns = [
path("ws/notifications/", consumers.NotificationConsumer.as_asgi()),
]
我的消费档案
class NotificationConsumer(AsyncJsonWebsocketConsumer):
groups = ['general_group']
async def connect(self):
await self.accept()
await self.channel_layer.group_add('notification_group', self.channel_name)
await self.channel_layer.group_send('notification_group',
{
'type': 'tester.message',
'tester': 'tester'
}
)
async def disconnect(self, close_code):
await self.channel_layer.group_discard('notification_group', self.channel_name)
客户端的 websocket javascript
我在客户端使用 javascript 创建为 websocket,如下所示
const notification_websocket = new WebSocket(
'ws://' +
window.location.host +
'/ws/notifications/'
);
notification_websocket.onmessage = function (e) {
let data = JSON.parse(e.data);
console.log("Just received this from the back end.. 0", data);
}
notification_websocket.onclose = function (e) {
console.log("websocket closed");
}
我意识到我使用了旧版本的 Redis(在 Windows 上使用 redis)并且问题恰好来自配置的 redis 部分。一旦我从使用 Redis 切换到使用 Memcache
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels.layers.InMemoryChannelLayer"
}
}
websocket-consumer 连接已连接并按预期保持打开...我希望找到在 Windows 上使用 Redis 更新版本进行开发的解决方案