使用Django频道作为进度指示器

时间:2017-04-07 18:01:29

标签: django django-channels

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

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

到目前为止,一切都按预期工作。我通过网络套接字提交任务。这是由我的消费者接收的,它调用其他方法来完成任务,然后通过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 })
    })  

在这个例子中,我的前端收到了“开始工作”。和完成的工作'消息同时发生,即使它们之间存在30秒的差距。

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

2 个答案:

答案 0 :(得分:3)

是的,您可以使用立即参数。

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

还提到了:

How do I ensure a Django Channels message is sent immediately without delay?

答案 1 :(得分:1)

您可以看一下这个项目:

https://gitlab.com/Baurin_lg/demo_channels_rest

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