2016-08-10 3 views
0

Я пытаюсь создать связанный с пользователем сервис websocket с каналами Django. У меня есть эта демультиплексора на первой линии моей routing.py:Как получить пользователя django после каналов. Демультиплексор?

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

Итак, теперь я пишу потребителей в routing.py:

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

или

route_class(another_app.MyConsumer),` 

и они hasn 't message.user на входе.

Нужно ли мне снова позвонить channel_session_user_from_http? Есть ли надежный способ добавления пользователя в Demultiplexer?

ответ

0

У меня была аналогичная проблема с доступом к пользователю в моей потребительской функции, и я закончил украсив его

@channel_session_user 
def ws_my_consumer(message): 

я не нашел способ сделать это, используя мой пользовательский класс демультиплексора. Я не уверен, что существует другое решение, потому что даже the documentation упоминает применение декораторов в крючковых потребителях

0

Варианта 1 - Получить пользователь в демультиплексоре

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 


Вариант 2 - Получить пользователь JsonWebsocketConsumer подкласс

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