python - 使用 Celery tasks.py 中的 Django 通道向客户端发送消息
问题描述
我正在尝试在 django 中使用通道(v2.1.7)将消息从服务器发送到客户端。当我执行下面的 celery 任务时,我的消息没有在 consumer.py 中获取(因此没有发送到客户端)并且令人惊讶的是没有发生错误。
我可以直接将消息从消费者发送到客户端。但我无法使用 async_to_sync() 从消费者外部发送。
(我尝试在标准 django views.py 中使用 async_to_sync 方法,但我遇到了同样的问题)
wololo/tasks.py
@app.task(name='wololo.tasks.upgrade_building')
def upgrade_building(user_id):
os.environ['DJANGO_SETTINGS_MODULE'] = 'DjangoFirebaseProject.settings'
from channels.layers import get_channel_layer
channel_layer = get_channel_layer()
print(channel_layer, "wololo")
async_to_sync(channel_layer.send)('chat', {
'type': 'hello.message',
'message': 'hadiInsss',
})
return True
wololo/consumers.py
from channels.generic.websocket import WebsocketConsumer
import json
from asgiref.sync import async_to_sync
class ChatConsumer(WebsocketConsumer):
def connect(self):
async_to_sync(self.channel_layer.group_add)("chat", self.channel_name)
self.accept()
def disconnect(self, close_code):
async_to_sync(self.channel_layer.group_discard)("chat", self.channel_name)
def hello_message(self, event):
print("U MUST SEE THAT MSG")
# Send a message down to the client
self.send(text_data=json.dumps(event['message']))
我在 celery 终端中的结果 点击查看 celery 终端
提前致谢
解决方案
看起来您正在使用 channel_layer.send 方法,但我认为您实际上想使用 channel_layer.group_send 。
推荐阅读
- python - 如何装饰属性以测量其执行时间?
- gitlab - gitlab socket connect:连接被拒绝
- arrays - 在数组对象中搜索特定字段并将其放入另一个数组中,以便以角度显示表格
- php - 如何在 Laravel Jetstream 中设置用户当前团队
- python - 如何修复 django 项目中的导入错误?
- android - EditText getText().toString() 未显示全文 Android
- operating-system - 如何找到物理地址和虚拟地址的位?
- mysql - 了解 rows_examined_per_scan 和 rows_produced_per_join
- parameters - 通配符作为snakemake中的参数?
- javascript - 由于数据库查询延迟了其余的 JS 代码