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不太熟悉,因此您可能希望在请求之后触发
您可以使用Redis和
实质上,当路由运行时,不是立即执行工作,而是将任务排队(在这种情况下,更新图形)以异步运行。这样,您可以确保以原子方式更新图表,或使用您选择的其他一些条件(例如,每十分钟仅更新一次)。