10

HTTP および socketio 要求を処理するために小さなサーバーをセットアップしようとしています。サーバーのセットアップ経験はあまりありませんが、現在、apache2 は http を問題なく提供しています。しかし、socketio トランザクションはエラー コード 400 (不正な要求) で失敗し続け、サーバー ログにいくつかの奇妙なエラーが表示されます。engineio エラーが表示され、サーバーが「不正な要求」とコード 400 で応答することがありますが、常にイベントレット サーバーを起動する必要があることが通知されます。

[Mon Jan 11 19:02:54.068282 2016] [:error] [pid 4908:tid 140274923673344] [client 100.96.180.39:53473]     return ws(environ, start_response)
[Mon Jan 11 19:02:54.068305 2016] [:error] [pid 4908:tid 140274923673344] [client 100.96.180.39:53473]   File "/var/www/projectENV/lib/python2.7/site-packages/engineio/async_eventlet.py", line 10, in __call__
[Mon Jan 11 19:02:54.068342 2016] [:error] [pid 4908:tid 140274923673344] [client 100.96.180.39:53473]     raise RuntimeError('You need to use the eventlet server.')
[Mon Jan 11 19:02:54.068380 2016] [:error] [pid 4908:tid 140274923673344] [client 100.96.180.39:53473] RuntimeError: You need to use the eventlet server. See the Deployment section of the documentation for more information.
[Mon Jan 11 19:02:54.253124 2016] [:error] [pid 4909:tid 140274940458752] WARNING:engineio:Invalid session cde3f9aadbee4794bf9d7bb98d0b396e

私のサーバー コードはかなり基本的なものです。

 from flask import Flask
 import flaskext.couchdb
 from flask.ext.socketio import SocketIO

 # for socketio
 import eventlet
 eventlet.monkey_patch()

 # creation of server & db objects
 app = Flask(__name__)

 # socketio initialization
 socketio =  SocketIO(app, async_mode='eventlet')

 # import views once site properties are set
 from app import views

 if __name__== "__main__":
     socketio.run(app, debug=True)

そして、Python で書かれた私のクライアント コードは、ドキュメントから直接 socketio-client ライブラリを使用します。

from socketIO_client import SocketIO, LoggingNamespace
with SocketIO(SERVER_URL, 80, LoggingNamespace) as socketIO:
    socketIO.emit('aaa')
    socketIO.wait(seconds=1)

socketio.run(app)私のためにイベントレットサーバーを起動することになっていませんか? サーバーが不正なリクエストを返すのはなぜですか (時々)?

4

1 に答える 1

16

WSGI アプリケーションをオンラインで利用できるようにするには、Web サーバーを介して公開する必要があります。アプリケーションが Flask-SocketIO を使用する場合、プレーンな WSGI Web サーバーでは不十分です。WSGI は WebSocket をサポートしていないため、WSGI プロトコルはこのプロトコルをサポートする非公式の拡張機能を必要とします。

Flask-SocketIO は、WebSocket をサポートするさまざまな Web サーバーをサポートしています。仮想環境にイベントレットがインストールされているように見えるため、イベントレット Web サーバーを使用する必要があるというエラーが表示されます。

あなたが気付いていないように見えるのは、Apache の Web サーバーを使用していることです (私は mod_wsgi を推測していますか?)。この Web サーバーは、通常の分岐 Web サーバーであり、イベントレット互換の Web サーバーではありません。

socketio.run(app) はイベントレット サーバーを起動するはずではありませんか?

はい、アプリケーションを 経由で実行socketio.run(app)すると、完全に有効化されたイベントレット Web サーバーが得られます。しかし、あなたはそれをしていません。Apacheで実行しています。Eventlet には Web サーバーがあり、apache には Web サーバーがあります。これらは 2 つの別個の Web サーバーであり、どちらも WSGI アプリケーションを実行できます。ただし、Apache は WebSocket をサポートしていません。

Flask-SocketIO のドキュメントには、有効な展開シナリオがいくつか記載されています。

于 2016-01-12T15:25:50.747 に答える