2017-10-04 4 views
1

Flask-SocketIO me pose des problèmes. Je suis en train d'initialiser des salles de chat privé avec le code suivant:Problème de Flask-SocketIO avec le Sid et les espaces de noms

@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) 

Malheureusement, je reçois des erreurs telles que AttributeError: 'Request' object has no attribute 'sid'. Même lorsque je spécifie spécifiquement request.sid, j'obtiens une erreur. Quand je branche quelque chose de aléatoire pour le champ sid dans join_room, j'obtiens alors une erreur d'espace de noms. Je me suis assuré que j'importe tout le nécessaire etc.

Voici le message d'erreur spécifique.

[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 - 

Répondre

1

Vous invoquez la on_join()-vous fonctionner à partir d'une route HTTP. Ce n'est pas comme ça que ça doit fonctionner. Les événements Socket.IO sont appelés lorsque le client appelle emit() sur cet événement. La variable request.sid existe uniquement dans le contexte d'un gestionnaire d'événements Socket.IO, qui ne sera pas présent dans un gestionnaire HTTP.

En fonction de votre trace de pile, je pense que vous devez modifier l'itinéraire start_chat de HTTP à Socket.IO. Le client devra demander à rejoindre le chat en effectuant un appel emit() au lieu d'envoyer une requête HTTP.

+0

Merci! Je suis un Noob à Flask et Socket.IO. Afin d'instancier plusieurs salles, les clients ouvrent de nouvelles connexions socket dans le code côté client, correct? La page Web qu'ils voient sera le HTML normal avec tout ce qui est spécifique à leur socket ouverte? – agaidis

+0

Vous pouvez associer une connexion client unique à plusieurs salles, sans avoir besoin de créer plusieurs connexions. Il est totalement correct d'appeler 'join_room()' plusieurs fois pour le même client. – Miguel

+0

Génial! Je vous remercie!! – agaidis