2014-01-24 48 views
4

控制器有$ http,它调用Flask上的api后端。我有一些基本的身份验证,并设置了crossdomain。第一次进入cpuListCtrl控制器时,$ http调用需要cca。 〜14sec。下一次我以角度访问控制器时,它只需要23ms。但每次我按浏览器刷新,回到〜14秒。来自浏览器的直接api调用也仅需23ms。所以我的问题是我需要这么长时间,我错过了什么,或者我应该看什么具体的?

编辑:更新的代码,以反映最近的变化:

var app = angular.module('RecycleApp', ['ngRoute', 'appControllers']); 
    app.config(['$httpProvider', function($httpProvider) { 
    $httpProvider.defaults.useXDomain = true; 
    delete $httpProvider.defaults.headers.common['X-Requested-With']; 
    } 
    ]); 

    app.config(['$routeProvider', function($routeProvider){ 
    $routeProvider 
    .when("/cpu", { 
     templateUrl:'static/js/partials/cpu.html', 
     controller:'cpuCtrl' 
    }) 
    }]); 

    var appControllers = angular.module('appControllers', []); 

    appControllers.controller('cpuCtrl', ['$scope','$http', 
function($scope,$http){ 
    $http({ 
     url: 'http://SOME_IP/api/v1/cpus', 
     method: 'POST', 
     data: JSON.stringify({"latitude":46.1948436, "longitude":15.2000873}), 
     headers: {"Content-Type":"application/json"} 
    }) 
    .success(function(data,status,headers,config){ 
     console.log(data.list); 
     $scope.cpus = data.list; 
    }) 
    .error(function(data,status,headers,config){ 
     console.log("something went wrong."); 
    }) 

}]); 

服务器端:

@app.route('/api/v1/cpus', methods=["GET"]) 
@cross_origin(origins='*', headers=("Content-Type")) 
def get_cpu_list(): 
    result = session.query(RecycleReUseCenter)\ 
      .options(load_only("Id", "CpuName"))\ 
      .all() 
    return list_json(result) 

@app.route("/api/v1/cpus", methods=["POST"]) 
@cross_origin(origins='*', headers=("Content-Type")) 
def get_cpu_list_with_locations(): 
    content = request.get_json(force=True) 
    given_latitude = content['latitude'] 
    given_longitude = content['longitude'] 

    result = RecycleReUseCenter.get_all_with_distance(given_latitude, given_longitude) 
    return list_json(result) 
+1

可能有一百万件事情,我们没有足够的信息来回答。您应该查看Chrome开发人员工具和后端API日志以了解请求,并查看它花费的时间。 –

+0

铬工具显示它的等待时间很长,烧瓶日志只在最后几毫秒注册到他的调用,我有一种感觉,$ http等待,并在一段时间后执行......我用$资源实现它,它是一样。 – zPrima

+0

这可能与webapi热身检查有关: http://weblog.west-wind.com/posts/2012/Sep/04/ASPNET-Frameworks-and-Raw-Throughput-Performance – Dalorzo

回答

0

你知道了肯定不会HTTP调用启动时?角度应用程序可能会卡在其他地方,并在最后一秒才能访问http调用。例如 - 在配置中你使用的是“令牌”,你从哪里得到它?在许多角度的应用程序中,这是从一些oauth服务,在一个seperete调用中提取的。只有在配置了http后,您的慢速呼叫才会启动。在令牌存在之后,下一次调用会更快,因为我们已经获得令牌。

要限制一些猜测,你可以使用像查尔斯代理工具 - 或deflect.io浏览器扩展程序来监视所有传出的HTTP调用,并想出解决办法

+0

我不需要使用Allow-Origin *和Allow-Header Content-Type的令牌,只是基本的CORS。 OPTIONS调用需要20秒,POST后几ms。认为问题可能在于默认烧瓶服务器如何处理这些事情。 – zPrima

+0

如果问题是OPTIONS调用 - 您是否尝试使用其他浏览器? (我认为Firefox不会这么做)。另外如果在heroku上的服务器? – alonisser

+0

不,它在firefox中是一样的,在挖掘OPOTIONS调用的响应之后,我看到它返回与GET请求相同的东西(json对象列表)。之后,POST调用被调用,返回我想要的结果。有什么办法可以消除额外的OPTIONS调用,或者它是如何与CORS一起使用的?服务器是虚拟的,在本地网络上的服务器上运行。 – zPrima

0

最近我有同样的问题,并发现实际上这个延迟实际上似乎在Flask结束,但只有在使用在Chrome中运行的Angular应用程序时才会发生。来自python stackexchange论坛的这个答案是我见过的最好的 - https://stackoverflow.com/a/25835028/1521331 - 它提供了各种解决方案,如果不是这个谜题的解释!

0

我有同样的问题,并没有上述工作对我来说。这里是什么做的:

Slow Requests on Local Flask Server

实际上,某些浏览器将尝试之前的IPv4访问IPv6的插座。在注释掉/ etc/hosts中的违规行并重新启动apache后,问题得到解决。