仅允许特定路线的一个烧瓶请求

时间:2016-09-13 11:54:32

标签: jquery python angularjs ajax flask

我有一个使用angularjs前端的烧瓶应用程序。我通过$ http服务发出http请求。如下面的代码所示。

@app.route('/updateGraph', methods = ['POST'])
     def updateGraph():
           selectValues = request.json['selectValues']
           selectSelected = np.array(request.json['selectSelected']).tolist()
           if len(selectSelected) == 0:
                selectSelected = np.array([selectValues[1:3]]).tolist()
           fig, listUnits = plot_Stock_vs_Sales(selectSelected)
           graph = py_offline.plot(fig, include_plotlyjs=False, output_type='div', show_link=False)
           return json.dumps({ 'graph': graph, 'listUnits':listUnits.reset_index().to_json(orient='records')})

和flask中的updateGraph函数如下。

{{1}}

问题是假设从角度两次使$ http帖子,烧瓶路线运行两次。这是来自服务器的代码。

  

  秒:92   127.0.0.1 - - [12 / Sep / 2016 09:46:35]" POST / updateGraph HTTP / 1.1" 200 -   秒:110   127.0.0.1 - - [12 / Sep / 2016 09:47:02]" POST / updateGraph HTTP / 1.1" 200 -

我想让$ http发布请求只允许一个请求或让每个用户只运行一个路由。这可能通过烧瓶吗?如果不是通过角度最好的方法是什么?

2 个答案:

答案 0 :(得分:1)

根据您对情况的描述,这可以在客户端更好地解决。

如果已经有针对该任务的请求,我只会设置一个标志(在全局或类级别定义)。例如:

if (processing) {
    return;
}
processing = true;
$http.post('/updateGraph', $scope.graphingParameters).success(function(response) {
        $scope.graphingParameters.graph = response.graph;
        $scope.listUnits = JSON.parse(response.listUnits);
        $scope.myHTML = $sce.trustAsHtml($scope.graphingParameters.graph);
        $scope.showME = true;
        processing = false;
    })

此实现还可用于隐藏/禁用按钮或触发用户请求的任何内容,以便在有正在进行的请求时不会触发它。

请注意,我对角度1并不十分熟悉,因此您可能希望在请求后触发processing = false,而不仅仅是success

答案 1 :(得分:0)

您可以使用Redis和python-rq等内容来实现任务或工作队列。

本质上,当路由运行时,不是立即执行工作,而是将任务排队(在本例中为更新图形)以异步运行。这样,您可以确保以原子方式更新图表,或使用您选择的其他一些条件(例如,每十分钟只更新一次)。