使用 Django Channels 作为进度指示器

Using Django Channels for a progress indicator

我有一个 Django 应用程序,它在服务器上执行一些计算,最多可能需要 30 秒。我正在尝试使用 django 通道创建进度指示器。

我的设置基于本教程: https://realpython.com/blog/python/getting-started-with-django-channels/

目前一切正常。我通过网络套接字提交任务。这是由我的消费者接收的,它调用其他方法来完成任务,然后 returns websocket 的结果。

但是,当我尝试从同一个消费者发送多条消息时,所有消息最后一起到达,而不是在发送时到达。

这是我的消费者代码:

@channel_session
def ws_receive(message):
    data = json.loads(message['text'])
    reply_channel = message.reply_channel.name

    Channel(reply_channel).send({
        "text": json.dumps({'progress': 'Starting Work'})
    })      

    # calls outside method to do work
    result = perform_calculations(data, reply_channel)

    Channel(reply_channel).send({
        "text": json.dumps({'progress': 'Finished Work','result':result })
    })  

在这个例子中,我的前端同时接收到 'Starting Work' 和 'Finished Work' 消息,即使它们之间有 30 秒的间隔生成。

有没有办法让这些消息实时到达?

是的,你可以使用 immediately 参数。

Channel(message.reply_channel).send({
    "text": json.dumps({'progress': 'Starting Work'})
}, immediately=True)

也在以下位置提到:

你可以看看这个项目:

https://gitlab.com/Baurin_lg/demo_channels_rest

这是一个使用 Django Rest 和 Django Channels 的演示。