2017-07-26 3 views
0

Je travaille sur un projet django avec des canaux impliqués dans différentes applications. La première application (recevoir des données d'un capteur) a son propre consommateur et routage, ainsi que le second (met à jour une liste d'utilisateurs connectés).Django Channels - Handshaking & Connect, mais la fonction websocket.connect n'est pas exécutée

Dans la première application tout fonctionne bien. Dans la deuxième application, l'établissement de la liaison est terminé et la connexion établie, mais la fonction liée à websocket.receive n'est pas exécutée.

from channels.routing import route, route_class 
from channels.staticfiles import StaticFilesConsumer 
from users.consumer import ws_connect, ws_disconnect 

channel_routing = [ 
    route('websocket.connect', ws_connect, path=r'^/users/lobby/'), 
    ... 
] 

et ws_connect

import json 
from channels import Group 
from channels.handler import AsgiHandler 
from channels.auth import channel_session_user, 
    channel_session_user_from_http, channel_session 

@channel_session_user_from_http 
def ws_connect(message): 
    print('test') 

Le print('test') de ws_connect est jamais exécuté. De plus, peu importe la fin de l'URL que j'utilise en javascript.

var ws = new WebSocket('ws://127.0.0.1:8000/users/lobby/'); 

ws.onopen = function() { 
    console.log('connect'); 
    ws.send('connect'); 
} 

Le ws du javascript se connecter avec .../users/lobby/ ou .../lobby/ de .../users/.

Merci pour tous les conseils à ce sujet!

Répondre

0

Depuis que j'ai apparemment besoin de 50 réputation pour faire un commentaire je vais juste faire une réponse à la place même si je ne suis pas sûr que ce soit la solution pour vous.

J'ai eu le même problème exact lors de la copie de parties du projet github multichat réalisé par le gars qui a fait les canaux. Mon problème était apparemment que je me trompais orthographié le routage avec une légère erreur et par conséquent, il n'a pas appelé la fonction correcte que j'avais configuré pour ce routage. Donc, mon conseil est que vous trippel vérifier le routage partout pour voir si vous avez foiré. Personnellement, je n'ai vérifié que le routage de mon APP lors de la vérification des erreurs, mais c'était dans mon dossier de projet que j'avais dérangé mon routage.

Une autre chose qui pourrait être la cause de ce problème est que vous avez seulement un routage dans votre application, mais pas dans le dossier principal. Dans ce cas, vous devez inclure l'autre application de routage avec le chemin que vous voulez pour elle comme une vue:

from channels import include 


channel_routing = [ 
     include("crypto_chat.routing.websocket_routing", path=r"^/chat/stream/$"), 
     include("crypto_chat.routing.chat_routing"), 
] 

routage App:

from channels import route 
from .consumers import ws_connect, ws_receive, ws_disconnect, user_offline, user_online, chat_send 

websocket_routing = [ 
    route("websocket.connect", ws_connect), 
    route("websocket.receive", ws_receive), 
    route("websocket.disconnect", ws_disconnect), 
] 

chat_routing = [ 
    route("chat.receive", chat_send, command="^send$"), 
    route("chat.receive", user_online, command="^online$"), 
    route("chat.receive",user_offline, command="^offline$"), 
] 

Si cette aide ne marche pas alors je vous suggère la tête sur à la page du canal github pour des exemples et comparez les deux. Gardez à l'esprit que le projet est probablement fait à partir d'une version plus récente de canaux (et peut-être django aussi).

https://github.com/andrewgodwin/channels-examples

aide et espère que cela comme je l'ai dit, je l'aurais fait un commentaire, mais je ne peux pas depuis mon représentant apparemment ...