Рендеринг данных на каналах Django из веб-сокета Python

Я пытаюсь отправить данные с моего клиента веб-сокета python на сервер Django Channels.

Я использую клиент веб-сокета python.

мой-websocket.py

def on_message(ws, message):
    print (message)

def on_error(ws, error):
    print ("eroror:", error)

def on_close(ws):
    print ("### closed ###")
    # Attemp to reconnect with 2 seconds interval
    time.sleep(2)
    initiate()

def on_open(ws):
    print ("### Initiating new websocket connectipython my-websocket.pyon ###")
    def run(*args):
        for i in range(30000):
            # Sending message with 1 second intervall
            time.sleep(1)
            ws.send("Hello %d" % i)
            # ws.send(json.dumps("Hello %d" % i))
        time.sleep(1)
        ws.close()
        print ("thread terminating...")
    _thread.start_new_thread(run, ())

def initiate():
    websocket.enableTrace(True)
    ws = websocket.WebSocketApp("ws://localhost:8000/ws/power/room/",
        on_message = on_message,
        on_error = on_error,
        on_close = on_close)
    ws.on_open = on_open

    ws.run_forever()

if __name__ == "__main__":
    initiate()

Мой потребитель каналов Django

потребитель.py

class EchoConsumer(WebsocketConsumer):

    def connect(self):
        self.room_name = self.scope['url_route']['kwargs']['room_name']
        self.room_group_name = 'power_%s' % self.room_name

        # Join room group
        async_to_sync(self.channel_layer.group_add)(
            self.room_group_name,
            self.channel_name
        )

        self.accept()

    def disconnect(self, close_code):
        # Leave room group
        async_to_sync(self.channel_layer.group_discard)(
            self.room_group_name,
            self.channel_name
        )

        # Receive message from WebSocket

    def receive(self, text_data):
        text_data_json = json.loads(text_data)
        message = text_data_json['message']

        # Send message to room group
        async_to_sync(self.channel_layer.group_send)(
            self.room_group_name,
            {
                'type': 'chat_message',
                'message': message
            }
        )

        # Receive message from room group

    def chat_message(self, event):
        message = event['message']

        # Send message to WebSocket
        self.send(text_data=json.dumps({
            'message': message
        }))

Ошибка

WebSocket HANDSHAKING /ws/power/room/ [127.0.0.1:54591]
WebSocket CONNECT /ws/power/room/ [127.0.0.1:54591]
Exception inside application: Expecting value: line 1 column 1 (char 0)
  File "C:\Program Files\Python37\lib\site-packages\channels\sessions.py", line 179, in __call__
    return await self.inner(receive, self.send)
  File "C:\Program Files\Python37\lib\site-packages\channels\middleware.py", line 41, in coroutine_call
    await inner_instance(receive, send)
  File "C:\Program Files\Python37\lib\site-packages\channels\consumer.py", line 59, in __call__
    [receive, self.channel_receive], self.dispatch
  File "C:\Program Files\Python37\lib\site-packages\channels\utils.py", line 52, in await_many_dispatch
    await dispatch(result)
  File "C:\Program Files\Python37\lib\site-packages\asgiref\sync.py", line 108, in __call__
    return await asyncio.wait_for(future, timeout=None)
  File "C:\Program Files\Python37\lib\asyncio\tasks.py", line 388, in wait_for
    return await fut
  File "C:\Program Files\Python37\lib\concurrent\futures\thread.py", line 57, in run
    result = self.fn(*self.args, **self.kwargs)
  File "C:\Program Files\Python37\lib\site-packages\channels\db.py", line 13, in thread_handler
    return super().thread_handler(loop, *args, **kwargs)
  File "C:\Program Files\Python37\lib\site-packages\asgiref\sync.py", line 123, in thread_handler
    return self.func(*args, **kwargs)
  File "C:\Program Files\Python37\lib\site-packages\channels\consumer.py", line 105, in dispatch
    handler(message)
  File "C:\Program Files\Python37\lib\site-packages\channels\generic\websocket.py", line 60, in websocket_receive
    self.receive(text_data=message["text"])
  File "C:\Users\Suleman\PycharmProjects\power\myChannels\consumers.py", line 41, in receive
    text_data_json = json.loads(text_data)
  File "C:\Program Files\Python37\lib\json\__init__.py", line 348, in loads
    return _default_decoder.decode(s)
  File "C:\Program Files\Python37\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Program Files\Python37\lib\json\decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
  Expecting value: line 1 column 1 (char 0)
WebSocket DISCONNECT /ws/power/room/ [127.0.0.1:54591]

Как вы можете видеть из ошибки, я могу установить рукопожатие между веб-сокетами, но данные не отображаются на веб-странице.

Совместимы ли Django-Channels с websocket-client? Я использую повторное подключение веб-сокетов в файле .js, который я использую для связи с каналами Django.

Scott Skiles 28.01.2019 20:05

Я не знаю. Я нигде не могу найти этот ответ; поэтому обращаюсь за помощью сюда.

Femme Fatale 29.01.2019 05:09

Привет еще раз. Я думаю, вам следует использовать фреймворк с повторным подключением веб-сокетов непосредственно в файле javascript или в вашем шаблоне Django, который подключается к каналам Django с использованием моста веб-сокетов и routing.py.

Scott Skiles 06.02.2019 21:04
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
1 120
2

Ответы 2

Можете ли вы попробовать добавить async в свою функцию chat_messageсогласно документации и посмотреть, поможет ли это?

async def chat_message(self, event):
    """
    Called when someone has messaged our chat.
    """
    ...

Если вы не используете синхронизацию с асинхронностью должным образом, то все не будет выполняться скоординировано. Если вы используете асинхронность и ожидание должным образом, ваш веб-сайт должен успеть установить рукопожатие и начать передачу данных перед закрытием.

Кроме того, похоже, что ваш group_send может потребоваться изменить, чтобы включить await, и я думаю, что вы, возможно, закрываете async_to_sync(self.channel_layer.group_send) слишком рано.

# Send message to room group
async_to_sync(
   await self.channel_layer.group_send(
        room.group_name,
       {
            'type': 'chat_message',
            'message': message
        }
    )
)

Нет, это не работает, все еще сталкиваюсь с ошибкой ----- отправить: b'\x81\x87\xf5\x0e5\x9b\xbdkY\xf7\x9a.\x05' отправить: b'\x88\x82\x19\xe4 \xabB\x1a\x0c' ###closed ### send: b'\x81\x87`EV:( :V\x0feg' Необработанное исключение в потоке, запущенном <function on_open.<locals>.run at 0x000001EED6A5EF28> Traceback (последний последний вызов): файл «my-websocket.py», строка 24, выполняется

Femme Fatale 28.01.2019 18:27

Хорошо, не могли бы вы обновить свой вопрос, чтобы отразить новый код, пожалуйста?

Scott Skiles 28.01.2019 20:02

Если я использую программу чата из учебника Django Channels, она работает, но я не могу отправлять сообщения из клиента веб-сокета.

Femme Fatale 29.01.2019 05:15

Опять же, я не уверен, что вам следует использовать websocket-client. Я думаю, вам следует добавить повторное подключение WebSocket в файл .js или в ваши шаблоны Django: npmjs.com/package/reconnecting-websocket. Затем нужно воспользоваться функциями «отправить» и «получить».

Scott Skiles 29.01.2019 15:40

Внимательно глядя на лог, кажется, что веб-сокет подключается:

 WebSocket CONNECT /ws/power/room/ [127.0.0.1:54591]

Но потребительский метод receive вызывает исключение JSON, безусловно, потому, что его аргумент text_data — это None.

Другие вопросы по теме