asyncio 'function' 对象没有属性 'send'
asyncio 'function' object has no attribute 'send'
我正在尝试每 30 秒向客户端发送一次消息,直到客户端在 Django 通道中断开连接。下面是为使用 asyncio 实现它而编写的一段代码。但是得到错误"AttributeError: 'function' object has no attribute 'send'"
。我以前没有使用过 asyncio,所以尝试了很多可能性,但都导致了某种错误(因为我没有经验)。
谁能帮我解决这个问题。
下面是代码:
class HomeConsumer(WebsocketConsumer):
def connect(self):
self.room_name = "home"
self.room_group_name = self.room_name
async_to_sync(self.channel_layer.group_add)(
self.room_group_name,
self.channel_name
)
self.accept()
self.connected = True
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
task = loop.create_task(self.send_response)
loop.run_until_complete(task)
async def send_response(self):
while self.connected:
sent_by = Message.objects.filter(notification_read=False).exclude(
last_sent_by=self.scope["user"]).values("last_sent_by__username")
self.send(text_data=json.dumps({
'notification_by': list(sent_by)
}))
asyncio.sleep(30)
def disconnect(self, close_code):
async_to_sync(self.channel_layer.group_discard)(
self.room_group_name,
self.channel_name
)
self.connected = False
我认为以下部分代码可能有问题:
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
task = loop.create_task(self.send_response)
loop.run_until_complete(task)
使用 loop = asyncio.get_event_loop()
而不是创建 new_event_loop()
结果:
RuntimeError: There is no current event loop in thread 'ThreadPoolExecutor-0_0'.
我发布这个解决方案作为答案是因为我搜索了很多关于如何在 django-channels 中没有客户端请求的情况下向客户端发送数据的方法。但找不到任何完整的解释或答案。所以希望这会帮助那些处于我所处情况的人。
感谢 user4815162342 为解决我遇到的问题提供的帮助。
class HomeConsumer(AsyncWebsocketConsumer):
async def connect(self):
self.room_name = "home"
self.room_group_name = self.room_name
await self.channel_layer.group_add(
self.room_group_name,
self.channel_name
)
await self.accept()
self.connected = True
try:
loop = asyncio.get_event_loop()
except:
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.create_task(self.send_response())
async def send_response(self):
while self.connected:
sent_by = Message.objects.filter(notification_read=False).exclude(
last_sent_by=self.scope["user"]).values("last_sent_by__username")
await self.send(text_data=json.dumps({
'notification_by': list(sent_by)
}))
await asyncio.sleep(30)
async def disconnect(self, close_code):
await self.channel_layer.group_discard(
self.room_group_name,
self.channel_name
)
self.connected = False
如有任何问题或过时的用法请指正
我正在尝试每 30 秒向客户端发送一次消息,直到客户端在 Django 通道中断开连接。下面是为使用 asyncio 实现它而编写的一段代码。但是得到错误"AttributeError: 'function' object has no attribute 'send'"
。我以前没有使用过 asyncio,所以尝试了很多可能性,但都导致了某种错误(因为我没有经验)。
谁能帮我解决这个问题。
下面是代码:
class HomeConsumer(WebsocketConsumer):
def connect(self):
self.room_name = "home"
self.room_group_name = self.room_name
async_to_sync(self.channel_layer.group_add)(
self.room_group_name,
self.channel_name
)
self.accept()
self.connected = True
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
task = loop.create_task(self.send_response)
loop.run_until_complete(task)
async def send_response(self):
while self.connected:
sent_by = Message.objects.filter(notification_read=False).exclude(
last_sent_by=self.scope["user"]).values("last_sent_by__username")
self.send(text_data=json.dumps({
'notification_by': list(sent_by)
}))
asyncio.sleep(30)
def disconnect(self, close_code):
async_to_sync(self.channel_layer.group_discard)(
self.room_group_name,
self.channel_name
)
self.connected = False
我认为以下部分代码可能有问题:
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
task = loop.create_task(self.send_response)
loop.run_until_complete(task)
使用 loop = asyncio.get_event_loop()
而不是创建 new_event_loop()
结果:
RuntimeError: There is no current event loop in thread 'ThreadPoolExecutor-0_0'.
我发布这个解决方案作为答案是因为我搜索了很多关于如何在 django-channels 中没有客户端请求的情况下向客户端发送数据的方法。但找不到任何完整的解释或答案。所以希望这会帮助那些处于我所处情况的人。
感谢 user4815162342 为解决我遇到的问题提供的帮助。
class HomeConsumer(AsyncWebsocketConsumer):
async def connect(self):
self.room_name = "home"
self.room_group_name = self.room_name
await self.channel_layer.group_add(
self.room_group_name,
self.channel_name
)
await self.accept()
self.connected = True
try:
loop = asyncio.get_event_loop()
except:
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.create_task(self.send_response())
async def send_response(self):
while self.connected:
sent_by = Message.objects.filter(notification_read=False).exclude(
last_sent_by=self.scope["user"]).values("last_sent_by__username")
await self.send(text_data=json.dumps({
'notification_by': list(sent_by)
}))
await asyncio.sleep(30)
async def disconnect(self, close_code):
await self.channel_layer.group_discard(
self.room_group_name,
self.channel_name
)
self.connected = False
如有任何问题或过时的用法请指正