Je construis un jeu en ligne, qui utilise Django canaux 2.1.5 pour les websockets.
Je peux établir la connexion entre le client et le serveur, et aussi envoyer des données entre eux uniquement à l'intérieur de la classe consommateur:
from channels.generic.websocket import WebsocketConsumer
import json
from . import controller
class GameConsumer(WebsocketConsumer):
def connect(self):
self.accept()
print("Wohooo .. Connected to client!")
self.render()
controller.startTurn()
def render(self, type="render", message=None):
self.send(controller.renderMap(type, message))
def disconnect(self, close_code):
print("WebSocket connection is lost...")
def receive(self, text_data):
text_data_json = json.loads(text_data)
controller.handleRecieved(text_data)
...
Maintenant, ce que je veux faire, c'est appeler la fonction render, -qui est à l'intérieur de la classe consommateur-, à partir d'un autre module
J'ai essayé ceci:
from .. import consumer
def sendDeployments(owner, armies):
type = "renderDeployments"
message = owner + " has " + str(armies) + " to deploy"
dummyConsumer = consumer.GameConsumer()
consumer.GameConsumer.render(type, message)
Mais a échoué car je ne peux pas utiliser le paramètre "self" en dehors de la classe.
Quelqu'un peut-il penser à un moyen d'atteindre mon objectif?
Ps: je ne me soucie pas de la synchronisation à cette occasion.
Le code correct pour la fonction de déconnexion (en utilisant les canaux 2.3.0) serait:
class GameConsumer(WebsocketConsumer):
....
def disconnect(self, close_code):
self.channel_layer.group_discard(self.channel_name, 'render_updates_group')