2017-10-04 17 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() 함수를 호출하고 있습니다. 이것이 어떻게 작동해야하는지가 아닙니다. Socket.IO 이벤트는 클라이언트가 해당 이벤트에서 emit()을 호출 할 때 호출됩니다. request.sid 변수는 Socket.IO 이벤트 처리기의 컨텍스트에만 존재하며 HTTP 처리기에는 없습니다.

스택 추적에 따르면 start_chat 경로를 HTTP에서 Socket.IO로 변경해야한다고 생각합니다. 클라이언트는 HTTP 요청을 보내는 대신 emit() 호출을 호출하여 채팅에 참여하도록 요청해야합니다.

+0

감사합니다. 나는 플라스크와 소켓에 멍청이야 .IO. 여러 개의 방을 인스턴스화하기 위해 클라이언트는 클라이언트 측 코드에서 새로운 소켓 연결을 열어 줍니까? 그들이 볼 수있는 웹 페이지는 열린 소켓에 특정한 것들이있는 일반 HTML이 될 것입니다. – agaidis

+0

단일 클라이언트 연결을 여러 회의실과 연결할 수 있으므로 여러 연결을 만들 필요가 없습니다. 동일한 클라이언트에 대해'join_room() '을 여러 번 호출하는 것은 괜찮습니다. – Miguel

+0

굉장! 고맙습니다!! – agaidis