Python 3.x 从RESTAPI或服务器向特定django websocket客户端发送响应

Python 3.x 从RESTAPI或服务器向特定django websocket客户端发送响应,python-3.x,websocket,redis,django-channels,Python 3.x,Websocket,Redis,Django Channels,在上面的代码中,我尝试将客户端连接到套接字,通过使用“subscribe”方法创建一个名为“job_1”的组并将其添加到通道层,为客户端订阅一个特定的“job_id”。创建组是动态的 我正在使用下面来自Google的“简单websocket客户端扩展”连接到上面的websocket。我能够与websocket建立连接并向其发送请求,如下图所示 现在,由于客户端已连接并订阅了特定的“作业id”, 我正在使用“邮递员”发送通知给上述已连接的客户端(简单websocket客户端扩展),通过在请求中传

在上面的代码中,我尝试将客户端连接到套接字,通过使用“subscribe”方法创建一个名为“job_1”的组并将其添加到通道层,为客户端订阅一个特定的“job_id”。创建组是动态的

我正在使用下面来自Google的“简单websocket客户端扩展”连接到上面的websocket。我能够与websocket建立连接并向其发送请求,如下图所示

现在,由于客户端已连接并订阅了特定的“作业id”, 我正在使用“邮递员”发送通知给上述已连接的客户端(简单websocket客户端扩展),通过在请求中传递作业id订阅特定的“作业id”,如下黄色所示

当我发布到“REST-API”时,我正在调用“consumer.py”文件的“send_job_notification(self、message、job_id)”方法以及“job_id”,如下图中黄色的“1”所示

在完成所有这些之后,我没有看到任何消息发送到通过“REST-API”调用订阅“job_id”的已连接客户端

任何帮助都将不胜感激,因为它已经拖了很长时间

编辑:

感谢您的建议Ken将方法设置为“@staticmethod”是值得的,但是Ken我如何让API向连接的客户端发送作业状态更新,因为我的长时间运行的作业将在某些进程中运行,并通过REST-API将更新消息发送回后端,然后更新需要发送到正确的客户端(通过WebSocket)

我对套接字使用者的API调用如下所示:

来自websocket\u消费者导入消费者
类websocket_connect(APIView):
def post(自我、请求、id):
consumers.ChatConsumer.send_job_通知(“hello”,id)

我的插座消费者代码如下:

编辑

consumer.py

    # accept websocket connection
    def connect(self):
    self.accept()

    # Receive message from WebSocket
    def receive(self, text_data):
     text_data_json = json.loads(text_data)
     command = text_data_json['command']
     job_id = text_data_json['job_id']
     if command == 'subscribe':
        self.subscribe(job_id)
     elif command == 'unsubscribe':
        self.unsubscribe(job_id)
     else:
        self.send({
            'error': 'unknown command'
        })

   # Subscribe the client to a particular 'job_id'
   def subscribe(self, job_id):
    self.channel_layer.group_add(
        'job_{0}'.format(job_id),
        self.channel_name
    )       

   # call this method from rest api to get the status of a job
   def send_job_notification(self, message, job_id):
    channel_layer = get_channel_layer()
    group_name = 'job_{0}'.format(job_id)
    channel_layer.group_send(
    group_name,
    {
        "type": "send.notification", 
        "message": message, 
    }
)   

# Receive message from room group
def send_notification(self, event):
    message = event['message']
    # Send message to WebSocket
    self.send(text_data=json.dumps(
     message))
}` 正如您所看到的,“Redis”服务也在运行

编辑-1


您不能直接从外部代码调用使用者中的方法,因为您需要将特定使用者实例连接到客户端。这是通道层的工作,通过使用消息传递系统或代理(如reddis)来实现。 从我所看到的,您已经朝着正确的方向前进,除了
发送作业通知
是一个实例方法,需要实例化使用者。将其改为静态方法,这样您就可以直接调用它,而无需使用者实例

`CHANNEL_LAYERS = {
"default": {
    "BACKEND": "channels_redis.core.RedisChannelLayer",
    "CONFIG": {
        "hosts": [("localhost", 6379)],
    },
},
在API视图中,您可以简单地将其称为:
ChatConsumer.发送作业通知(消息、作业id)

你能在调用消费者方法的REST API中发布代码吗?强烈建议不要在这里发布截图,因为人们很难复制你的代码并试用。请重新发布格式化的代码,我发现很难理解你的问题。你想发送工作状态更新吗?你如何获得美国更新?您可以通过调用send_job_通知并将作业状态/进度作为消息传递,从执行作业的流程发送它们。但是,我可能没有正确理解您。我尝试格式化代码,但编辑器抛出错误,因此我添加了屏幕截图。是的,您是对的,我从流程doi获得更新取消作业并将这些更新提供给API,然后API调用“发送作业通知”,将“消息”和“作业id”作为参数传递给connect“websocket”客户端发送作业通知。希望您理解。太好了。如果您已经了解了,那么您的问题是什么?问题是屏幕截图中的错误吗你可以看到你有额外的`需要删除,json包也需要导入。请将代码添加到原始帖子中,并将其格式化以使其可读。另外,不要发布错误的屏幕截图。发布回溯,因为它不可读。wayKen建议我编辑原始帖子,你可以吗看一看。我已经在“编辑:”下标记了更改:
@staticmethod
def send_job_notification(message, job_id):
    channel_layer = get_channel_layer()
    group_name = 'job_{0}'.format(job_id)
    channel_layer.group_send(
    group_name,
    {
        "type": "send.notification", 
        "message": message, 
    }