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');
});
}]);
編集:
同じ問題が発生しました。いくつかの調査の結果、問題はChromeが接続を使用する方法と、モノスレッドとしてのflask)のデフォルト構成に関連しています。
flaskアプリの起動時にthreaded = trueを追加して、問題を解決しました:
app.run(threaded=True)
同じ問題が発生しました(AngularフロントエンドがChromeおよびFlaskバックエンドで実行されています)。両方を試した後Angular 1.2.xと1.3.x、およびその他の10億の順列で、私が見つけた唯一の「解決策」は、Tornado Webサーバーで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()
次のように入力して、Webサーバーを起動できます。
python myserver.py
私は今、非常によく似た問題に直面しています。私の現在の解決策(現時点で私のシェフに受け入れられます:))は、残念ながらすべての問題を取り除くことはできませんが、header:{ 'Content-Type': 'application/json' }
を{ 'Content-Type': 'text/plain' }
に設定することです。現在、最初のGET
リクエストだけが非常に遅く、次のリクエストは500ミリ秒未満かかります。フロントエンドでRestangular
を使用し、バックエンドでwsgiref.simple_server
を使用しています。