0

I am trying to send data to Django Channels (chat application) from Python web socket client . I am able to do the handshake but my data (string) is not being populated in the chat web page.

My consumers of django channels

consumers.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
        }))

My Python web socket client

my-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)
        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()

The error i am receiving at ASGI server is

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

where as the error which i am receiving at client end is

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

I think there is something wrong with data type. Maybe i am not sending json and it is creating problem.

1 Answer 1

1

Try sending JSON data instead of a string.

import json
...
ws.send(json.dumps({
  'message': "Hello %d" % i
}))
Sign up to request clarification or add additional context in comments.

2 Comments

tried that even but its not working. It gives error of "string indices must be integers" at channels server
@FemmeFatale I just noticed that the consumer expects a dictionary with a 'message' key. I updated my answer, could you try this?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.