Чрезвычайно длительное время ожидания при загрузке ресурса REST из angularjs

Я создаю front-end в angular, который обращается к API RESTful с флягой /python. Я использую AngularJS v1.2.16.

По какой-то причине время, затрачиваемое на загрузку ресурса REST, требует безумного времени, причем большая часть времени просто ждет. Я понимаю, что "ожидание" измеряет время до первого байта - все мои службы выполняются локально (интерфейс, API и база данных).

Angular, the API and the Mongo DB are all running locally.

Учитывая, что все службы выполняются локально, я затрудняюсь отладить это. Есть ли у кого-нибудь советы о том, где искать? Я проверил все свои методы, и они работают достаточно быстро (до 100 мс за вызов REST). Когда я использую postman, API возвращается почти мгновенно.

Любые идеи о том, как исправить ожидание, похоже, что это происходит при загрузке ресурса RESTful через angular. Запрос 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');
        });
    }]);

EDIT:

  • проблема появляется только в Google Chrome, в обычном режиме.
  • запросы GET бывают быстрыми, если вы используете режим инкогнито.

Ответ 1

Я столкнулся с той же проблемой (Angular frontend работает в Chrome и Flask backend). После попыток как Angular 1.2.x и 1.3.x, так и миллиарда других перестановок, единственное "решение", которое я нашел, - запустить бленд Flask с веб-сервером Tornado (http://www.tornadoweb.org/en/stable/). Другие контейнеры WSGI могут работать, но это тот, который я тестировал.

В приложении "Ключ" вставьте следующее:

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

Ответ 2

У нас была та же проблема, и после некоторых исследований проблема связана с тем, как Chrome использует соединения и стандартную конфигурацию фляжки как монопоточную.

Добавлен threaded = true, когда запущено приложение флэша, решена проблема:

app.run(threaded=True)

Ответ 3

Я столкнулся с очень похожим вопросом. Мое текущее решение (приемлемое для моего шеф-повара в этот момент:)), которое, к сожалению, не устраняет все проблемы, заключается в установке заголовка: { 'Content-Type': 'application/json' } to { 'Content-Type': 'text/plain' }. Теперь только первый запрос GET сумасшедший медленный, каждый следующий занимает менее 500 мс. Я использую Restangular в интерфейсе и wsgiref.simple_server на сервере.

Ответ 4

Я хотел связать этот. Но

app.run(threaded=True) 

работал у меня!