Python-在Flask中将查询结果从服务器返回到客户端

时间:2018-11-12 00:09:59

标签: python json rest flask client-server

  • 我拥有的

    我在Flask中有一个客户端/服务器。客户端将JSON格式的查询发送到服务器,并且服务器创建JSON文件。还有另一个工具可以接受此查询,在数据库上执行该查询,然后将结果写入results.txt文件。服务器会定期检查“结果”目录中的.txt文件,如果找到新文件,它将提取结果。对于定期检查,我使用了APS。

  • 我想做什么 现在,我要将服务器从.txt文件中提取的数据(queryResult)发送回客户端。

这是我到目前为止所做的。

  • 服务器代码:
"cy" : yScale
  • 客户代码
    let groups = svg.selectAll("g")
            .data(dataset)
            .enter()
            .append("g")



        groups.append("title")
            .text(d => d.country)


       groups
        .append("path").classed("line", true)
        .attr("d", d => line(d.emissions))
        .style("stroke-width", d => 
            d.country === "China" ? 1 : 0.2
        )

       let circle = groups.selectAll("circle")
            .data(d => d.emissions)
            .enter()
            .append("circle");


           circle.attrs({
                "cx": d => xScale(d.year),
                "cy": d => yScale(d.amount),
                "r" : 3
            })
            .style("opacity", 0)




           circle.on("mouseover", () => 
                d3.select(this)
                    .call(mouseOverFunc));

            const mouseOverFunc = selection => 
                selection
                    .transition()
                    .duration(10)
                    .style("opacity", 1)
                    .style("fill", "turquoise")
                    .attr("r", 3)   

有人可以帮助我如何将此queryResult发送回客户端吗?

编辑:我希望服务器每次在Tool目录中遇到新文件时都将queryResult发送回客户端,即,每次找到新文件时,它将提取结果(当前正在执行)并将其发送回客户端。

1 个答案:

答案 0 :(得分:0)

您要执行的操作称为Web Worker Architecture

要将实时摘要queryResult从后台作业传递到客户端应用程序,可以使用消息队列(建议使用Kafka,RabbitMQ也可以)和Web套接字的组合。当客户端向/data端点发送请求时,您应该返回一些唯一的令牌(例如,如果您的用户是匿名用户,则为UUID;如果已通过身份验证,则为用户ID)。您应该在结果文件的名称中添加相同的标记。当后台工作人员完成文件处理后,它将使用令牌(来自文件名)来创建Kafka或RabbitMQ主题(例如topic_for_user_id_1337topic_for_uuid_jqwfoj-123qwr),并将queryResult作为消息发布。

与此同时,您的客户端应建立Web套接字连接(Flask对于Web套接字而言是相当糟糕的,但是无论如何,都很少有很好的库,例如socketio),并将令牌通过它传递给后端因此它将创建一个消息队列订阅者,并使用令牌的名称订阅一个主题,以便在后台作业完成时,Web后端将接收到一条消息并将其通过Web套接字传递给用户。

P.S。如果听起来过于复杂,则可以避免使用MQ和WS,并将queryResult放入数据库中,并创建一个端点来检查它是否存在于数据库中。如果没有,则返回not ready yet之类的内容,如果准备就绪,客户端将在几秒钟后重试-您从数据库返回了queryResult