Проблема с Flask-SocketIO с sid и пространствами имен

Flask-SocketIO доставляет мне некоторые неприятности. Я пытаюсь инициализировать частные чаты с помощью следующего кода:

@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 ответ

Решение

Вы вызываете on_join() функционировать самостоятельно по маршруту HTTP. Это не так, как это должно работать. События Socket.IO вызываются, когда клиент вызывает emit() на этом событии. request.sid Переменная существует только в контексте обработчика событий Socket.IO, который не будет присутствовать в обработчике HTTP.

На основании вашей трассировки стека, я думаю, вам нужно изменить start_chat маршрут от HTTP до Socket.IO. Клиент должен будет запросить присоединение к чату, сделав emit() звоните вместо отправки HTTP-запроса.

Другие вопросы по тегам