web-dev-qa-db-fra.com

Envoyer un message en utilisant Django Canaux de la classe Consumer externe

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.

8
Ahmed Hammad

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')
0
riu