从AngularJS加载REST资源时等待时间极长
我正在用Angular构建一个前端,它要访问一个用Flask/Python写的RESTful API。我使用的是AngularJS v1.2.16。
不知道为什么,加载这个REST资源的时间特别长,大部分时间都在等待。我理解的“等待”是指从服务器接收到第一个字节的时间——我的所有服务都是在本地运行的(前端、API和数据库)。
因为这些服务都是在本地运行的,所以我不知道该怎么调试这个问题。有没有人能给我一些建议,看看该从哪里入手?我检查了所有的方法,它们的运行速度都还不错(每个REST调用都在100毫秒以内)。当我使用Postman时,API几乎是瞬间就返回了。
有没有什么办法可以解决这个等待的问题?似乎只有在通过Angular加载RESTful资源时才会出现这种情况。Angular的$http GET请求其实挺简单的:
myAppControllers.controller('ManageCtrl', ['$scope', '$http',
function($scope, $http) {
$http({
url: 'http://127.0.0.1:5000/v1/domains/',
method: "GET",
headers: { 'Content-Type': 'application/json' },
}).
success(function(data, status, headers, config) {
console.log('login successful');
console.log(status);
console.log(data);
}).
error(function(data, status, headers, config) {
console.log('login failed');
});
}]);
编辑:
- 这个问题只出现在Google Chrome的普通模式下。
- 在隐身模式下,GET请求的速度很快。
4 个回答
我现在遇到了一个很相似的问题。我目前的解决办法(对我老板来说暂时可以接受 :)),虽然并不能解决所有问题,就是把请求头从{ 'Content-Type': 'application/json' }
改成{ 'Content-Type': 'text/plain' }
。现在只有第一次的GET
请求特别慢,后面的请求都在500毫秒以内。我在前端使用Restangular
,后端用的是wsgiref.simple_server
。
我遇到了同样的问题(Angular前端在Chrome浏览器上运行,Flask后端)。我尝试了Angular 1.2.x和1.3.x,还有很多其他组合,最终找到的唯一“解决办法”就是用Tornado网络服务器来运行Flask后端(http://www.tornadoweb.org/en/stable/)。其他的WSGI容器可能也能用,但这是我测试过的。
在你的Flask应用中,粘贴以下内容:
from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
if __name__ == '__main__':
http_server = HTTPServer(WSGIContainer(app))
http_server.listen(5000)
IOLoop.instance().start()
你可以通过输入以下命令来启动你的网络服务器:
python myserver.py
我们也遇到了同样的问题,经过一些研究发现,这个问题和Chrome使用连接的方式以及Flask默认是单线程的配置有关。
在启动Flask应用时加上threaded=true就解决了这个问题:
app.run(threaded=True)