2016-08-10 1 views
0

Ich versuche einen benutzerbezogenen Websocket-Dienst mit Django Channels zu erstellen. Ich habe diese Demultiplexer in erster Linie meiner routing.py:Wie bekomme ich einen Django-Benutzer nach den Channels.Demultiplexer?

def checkauth(f): 
    def wrapper(*args, **kwargs):   
     if args[0].message.user.is_anonymous(): 
      args[0].send(stream="auth", payload = {'m':'pissoff'}) 
      args[0].close() 
      return 
     return f(*args, **kwargs) 
    return wrapper 


class Demultiplexer(WebsocketDemultiplexer): 
    http_user = True 

    mapping = {"auth": "user.tracking",} 

    @checkauth 
    def connect(self, message, **kwargs): 

    @checkauth 
    def receive(self, content, **kwargs): 

So, jetzt habe ich die Verbraucher in routing.py schreiben:

route('user.tracking', another_app.myconsumer), 

oder

route_class(another_app.MyConsumer),` 

und sie hasn 't message.user in der Eingabe.

Muss ich channel_session_user_from_http erneut anrufen? Gibt es eine zuverlässige Möglichkeit, Benutzer in Demultiplexer anzuhängen? Dekorieren Sie es mit

@channel_session_user 
def ws_my_consumer(message): 

Antwort

0

hatte ich ähnliches Problem mit Benutzern in meinem Verbraucher Funktion zugreifen und ich am Ende habe mich nicht einen Weg finden, es zu tun, um meine benutzerdefinierten Demultiplexer-Klasse. Ich bin mir nicht so sicher, dass es eine andere Lösung gibt es, weil auch the documentation erwähnt Dekorateure in dem Haken Verbraucher

0

Option 1 mit - Get Benutzer in Demultiplexer

from channels.generic.websockets import WebsocketDemultiplexer 
from foo.consumers import WsFooConsumer 

class Demultiplexer(WebsocketDemultiplexer): 
    http_user = True 

    consumers = { 
     "foo": WsFooConsumer, 
    } 

    def connect(self, content, **kwargs): 
     print self.message.user 


Option 2 - Get Benutzer in JsonWebsocketConsumer Unterklasse

from channels.generic.websockets import WebsocketDemultiplexer 
from foo.consumers import WsFooConsumer 


class Demultiplexer(WebsocketDemultiplexer): 
    consumers = { 
     "notifications": WsFooConsumer, 
    } 

foo.consumers

from channels.generic.websockets import JsonWebsocketConsumer 

class WsFooConsumer(JsonWebsocketConsumer): 
    http_user = True 

    def connect(self, message, multiplexer, **kwargs): 
     print message.user 

    def disconnect(self, message, multiplexer, **kwargs): 
     print message.user 

    def receive(self, content, multiplexer, **kwargs): 
     print self.message.user