从AngularJS加载REST资源时等待时间极长

19 投票
4 回答
13924 浏览
提问于 2025-04-18 06:27

我正在用Angular构建一个前端,它要访问一个用Flask/Python写的RESTful API。我使用的是AngularJS v1.2.16。

不知道为什么,加载这个REST资源的时间特别长,大部分时间都在等待。我理解的“等待”是指从服务器接收到第一个字节的时间——我的所有服务都是在本地运行的(前端、API和数据库)。

Angular、API和Mongo DB都在本地运行。

因为这些服务都是在本地运行的,所以我不知道该怎么调试这个问题。有没有人能给我一些建议,看看该从哪里入手?我检查了所有的方法,它们的运行速度都还不错(每个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 个回答

0

我想把这个也一起提到。不过

app.run(threaded=True) 

对我来说,这个方法有效!

0

我现在遇到了一个很相似的问题。我目前的解决办法(对我老板来说暂时可以接受 :)),虽然并不能解决所有问题,就是把请求头从{ 'Content-Type': 'application/json' }改成{ 'Content-Type': 'text/plain' }。现在只有第一次的GET请求特别慢,后面的请求都在500毫秒以内。我在前端使用Restangular,后端用的是wsgiref.simple_server

13

我遇到了同样的问题(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
23

我们也遇到了同样的问题,经过一些研究发现,这个问题和Chrome使用连接的方式以及Flask默认是单线程的配置有关。

在启动Flask应用时加上threaded=true就解决了这个问题:

app.run(threaded=True)

撰写回答