2017-10-04 29 views
1

Flask-SocketIOが問題を起こしています。Flask-SocketIO sidとnamespaceで問題が発生しました

@socketio.on('join', namespace='/join') 
def on_join(receiver_name): 
    username = session['username'] 
    join_room(receiver_name) # start a chat room with the receiver's username 
    send(username + ' is now connected.', room=receiver_name) 

は、残念ながら、私は、このようなAttributeError: 'Request' object has no attribute 'sid'などのエラーを取得しています:私は、次のコードでのプライベートチャットルームを初期化しようとしています。 request.sidを具体的に指定してもエラーになります。 sidフィールドのランダムなものをjoin_roomに接続すると、名前空間エラーが発生します。私は必要なものをすべてインポートしていることを保証しました。

ここに特定のエラーメッセージがあります。

[2017-10-04 10:02:48,297] ERROR in app: Exception on /start_chat [POST] 
Traceback (most recent call last): 
    File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1982, in wsgi_app 
    response = self.full_dispatch_request() 
    File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1614, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
    File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1517, in handle_user_exception 
    reraise(exc_type, exc_value, tb) 
    File "/usr/local/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise 
    raise value 
    File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1612, in full_dispatch_request 
    rv = self.dispatch_request() 
    File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1598, in dispatch_request 
    return self.view_functions[rule.endpoint](**req.view_args) 
    File "/Users/agaidis/Desktop/challenge-backend-master/challenge-eng-base-master/backend-python/app.py", line 132, in start_chat 
    on_join(friend_username) 
    File "/Users/agaidis/Desktop/challenge-backend-master/challenge-eng-base-master/backend-python/app.py", line 152, in on_join 
    join_room(receiver_name) # start a chat room with the receiver's username 
    File "/usr/local/lib/python3.6/site-packages/flask_socketio/__init__.py", line 756, in join_room 
    sid = sid or flask.request.sid 
    File "/usr/local/lib/python3.6/site-packages/werkzeug/local.py", line 347, in __getattr__ 
    return getattr(self._get_current_object(), name) 
AttributeError: 'Request' object has no attribute 'sid' 
127.0.0.1 - - [04/Oct/2017 10:02:48] "POST /start_chat HTTP/1.1" 500 - 

答えて

1

HTTPルートからon_join()関数を呼び出しています。これがどのように動作するはずではありません。クライアントがそのイベントでemit()を呼び出すと、Socket.IOイベントが呼び出されます。 request.sid変数は、Socket.IOイベントハンドラのコンテキストにのみ存在し、HTTPハンドラには存在しません。

スタックトレースに基づいて、start_chatルートをHTTPからSocket.IOに変更する必要があると思います。クライアントは、HTTPリクエストを送信する代わりにemit()コールを行うことによってチャットへの参加をリクエストする必要があります。

+0

ありがとうございました!私はFlaskとSocket.IOの騒ぎです。複数の部屋をインスタンス化するために、クライアントはクライアント側のコードで新しいソケット接続を開きますが、正しいですか?彼らが見ているWebページは、開いているソケットに固有のものは何でも、通常のHTMLになりますか? – agaidis

+0

単一のクライアント接続を複数のルームに関連付けることができます。複数の接続を作成する必要はありません。同じクライアントに対して 'join_room()'を何度も呼び出すことは大丈夫です。 – Miguel

+0

恐ろしい!ありがとうございました!! – agaidis

関連する問題