停留在 AsyncWebsocketConsumer 实现
Stuck at AsyncWebsocketConsumer implementation
我正在尝试开发一个消费者(AsyncWebsocketConsumer 类型),它将与 websocket 连接并使用 JavaScript 对前端进行更改。
我未能实现的第一件事是消费者的功能(连接、发送、断开连接)。此外,使用 Redis。
我的settings.py是
ASGI_APPLICATION = "myapp.routing.application"
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer',
'CONFIG': {
'hosts': [('localhost', 6379)],
},
}
}
而我的 routing.py 是
application = ProtocolTypeRouter({
"channel": ChannelNameRouter({
"example": ExampleConsumer,
}),
})
最后,我的consumers.py是
class ExampleConsumer(AsyncWebsocketConsumer):
async def connect(self,msg):
# Called on connection.
# To accept the connection call:
await self.accept()
print('Channel connected')
当我尝试时:
channel_layer = get_channel_layer()
async_to_sync(channel_layer.send)('example', {'type': 'connect'})
这样我就可以调用 connect 并查看让我知道套接字已连接的连接消息,然后继续发送消息,我得到 :
raise NotImplementedError("You must implement application_send()")
You must implement application_send()
我很确定我误解了很多东西,但我一直在寻找如何解决这个问题,但我找不到对我的案例有用的东西,比如示例或好的文档,所以无论如何帮助将不胜感激!
您使用的 ChannelLayers 有误。它们用于在应用程序的不同实例之间进行通信。不适用于实际建立 WebSocket 连接。
试试这个:
settings.py
ASGI_APPLICATION = "myapp.routing.application" # make sure your project is called 'myapp' ;-)
routing.py
application = ProtocolTypeRouter({
'websocket': AuthMiddlewareStack(
URLRouter([
path('ws/example/', consumers.ExampleConsumer),
])
),
})
consumers.py
class ExampleConsumer(AsyncWebsocketConsumer):
async def connect(self,msg):
# Called on connection.
# To accept the connection call:
await self.accept()
print('Channel connected')
async def receive(self, data):
# do something with data
print(data)
# send response back to connected client
await self.send('We received your message')
您可以使用 Simple Websocket Client 来测试您的 ws-endpoint。
- 连接到 http://localhost:8000/ws/example/:您应该会在控制台上看到 "Channel connected",以及客户端已连接的消息。
- 发送带有一些数据的请求。此数据应记录在控制台中,您将收到返回给客户端的响应。
希望对您有所帮助。
我正在尝试开发一个消费者(AsyncWebsocketConsumer 类型),它将与 websocket 连接并使用 JavaScript 对前端进行更改。 我未能实现的第一件事是消费者的功能(连接、发送、断开连接)。此外,使用 Redis。
我的settings.py是
ASGI_APPLICATION = "myapp.routing.application"
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer',
'CONFIG': {
'hosts': [('localhost', 6379)],
},
}
}
而我的 routing.py 是
application = ProtocolTypeRouter({
"channel": ChannelNameRouter({
"example": ExampleConsumer,
}),
})
最后,我的consumers.py是
class ExampleConsumer(AsyncWebsocketConsumer):
async def connect(self,msg):
# Called on connection.
# To accept the connection call:
await self.accept()
print('Channel connected')
当我尝试时:
channel_layer = get_channel_layer()
async_to_sync(channel_layer.send)('example', {'type': 'connect'})
这样我就可以调用 connect 并查看让我知道套接字已连接的连接消息,然后继续发送消息,我得到 :
raise NotImplementedError("You must implement application_send()") You must implement application_send()
我很确定我误解了很多东西,但我一直在寻找如何解决这个问题,但我找不到对我的案例有用的东西,比如示例或好的文档,所以无论如何帮助将不胜感激!
您使用的 ChannelLayers 有误。它们用于在应用程序的不同实例之间进行通信。不适用于实际建立 WebSocket 连接。
试试这个:
settings.py
ASGI_APPLICATION = "myapp.routing.application" # make sure your project is called 'myapp' ;-)
routing.py
application = ProtocolTypeRouter({
'websocket': AuthMiddlewareStack(
URLRouter([
path('ws/example/', consumers.ExampleConsumer),
])
),
})
consumers.py
class ExampleConsumer(AsyncWebsocketConsumer):
async def connect(self,msg):
# Called on connection.
# To accept the connection call:
await self.accept()
print('Channel connected')
async def receive(self, data):
# do something with data
print(data)
# send response back to connected client
await self.send('We received your message')
您可以使用 Simple Websocket Client 来测试您的 ws-endpoint。
- 连接到 http://localhost:8000/ws/example/:您应该会在控制台上看到 "Channel connected",以及客户端已连接的消息。
- 发送带有一些数据的请求。此数据应记录在控制台中,您将收到返回给客户端的响应。
希望对您有所帮助。