2014-01-24 47 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後,問題得到解決。