1

私はリアルタイムのチャットと写真共有のアプリケーションに取り組んでいます。サーバー側として Flask を使用して RESTful Web サービスを構築し、Ionic フレームワーク (AngularJS) を使用してモバイルでクライアントを構築しています。

ユーザーの新しいフィードを返す Web サービス エンドポイント [GET] /feeds/user_id があります。次のコード行を使用してアプリを初期化すると、localhost とモバイルで実行されているアプリケーションの両方からデータを正しく取得できます。

app.run(host='0.0.0.0', debug=True)

リアルタイム チャットでアプリをビルドするときは、Flask-SocketIO を使用し、公式ドキュメントで指定されているように、アプリを初期化する方法を以下の方法に変更します。

socketio.run(app, host='0.0.0.0', policy_server=False)

ただし、上記の初期化方法ではモバイルアプリからデータを取得できません。サンプル ログの 1 つを次に示します。

192.168.1.100 - - [2015-09-13 23:38:32] "GET http://192.168.1.101:5000/feeds/1 HTTP/1.1" 404 342 0.002000

ただし、同じリンクを使用して、ローカルホストと同じネットワーク内の別のマシンからデータを取得できるため、サーバーがすべてのパブリック IP をリッスンしていると確信しています。ファイアウォールも無効にしました。

以下の私のコードスニペット:

from app import socketio, app
if __name__ == '__main__':
    socketio.run(app, host='0.0.0.0', policy_server=False)
    # app.run(host='0.0.0.0', debug=True)

どんな助けでも大歓迎です!

更新: app.run() のみを使用すると、ログは次のようになります。

192.168.1.110 - - [20/Sep/2015 00:17:23] "GET http://192.168.1.103:5000/feeds/1 HTTP/1.1" 200 -

Miguel が述べたように、これは奇妙なログですが、Flask の堅牢性のおかげで機能します。

また、iOS でアプリを実行しようとしましたが、これは完全に正常に動作します。今、私はそれが Android プラットフォーム上の Ionic フレームワークの問題であるか、単に私のデバイス上にあると考えています。私の端末は Nexus 7 Gen 1 で、Android 5.1.1 を実行しています。

4

1 に答える 1

1

私は自分の問題を自分で解決しました。

Flask と Flask-SocketIO は同じタイプのサーバーを起動しません - Flask は標準の Werkzeug 開発 Web サーバーを起動しますが、Flask-SocketIO は gevent Web サーバーを起動します。そのため、質問で述べたようにさまざまな動作が見られますが、問題は Flask にはありません。

本当の問題は、組み込みの WebView がサーバー側への HTTP 要求を処理する方法にあります。私のデバイスでは、WebView がリクエストを奇妙な方法で処理しているようです。これについては詳しく調べていません。この結果、gevent Web サーバーはこの HTTP 要求を処理できず、404 になります。

これを解決する方法は、最新の Chrome バージョンの WebView をアプリにパッケージ化することです。クロスウォークでやってます。それは私の問題を完全に解決しました。

于 2015-09-24T14:48:41.523 に答える