关于jquery:仅允许特定路径的一个烧瓶请求

Allow only one flask request for a particular route

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

1
2
3
4
5
6
$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;
    })

并且烧瓶中的updateGraph函数如下。

1
2
3
4
5
6
7
8
9
@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')})

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

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

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


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

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

1
2
3
4
5
6
7
8
9
10
11
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;
    })

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

请注意,我对angular 1不太熟悉,因此您可能希望在请求之后触发processing = false,而不仅仅是在success上。


您可以使用Redis和python-rq之类的东西来实现任务或工作队列。

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