Send StreamingHttpResponse in django channels

195 Views Asked by At
Exception inside application: 'StreamingHttpResponse' object has no attribute 'encode'
Traceback (most recent call last):
  File "C:\Users\Tamerlan\Desktop\chatbot_project\venv\lib\site-packages\django\contrib\staticfiles\handlers.py", line 101, in __call__
    return await self.application(scope, receive, send)
  File "C:\Users\Tamerlan\Desktop\chatbot_project\venv\lib\site-packages\channels\routing.py", line 62, in __call__
    return await application(scope, receive, send)
  File "C:\Users\Tamerlan\Desktop\chatbot_project\venv\lib\site-packages\channels\sessions.py", line 47, in __call__
    return await self.inner(dict(scope, cookies=cookies), receive, send)
  File "C:\Users\Tamerlan\Desktop\chatbot_project\venv\lib\site-packages\channels\sessions.py", line 263, in __call__
    return await self.inner(wrapper.scope, receive, wrapper.send)
  File "C:\Users\Tamerlan\Desktop\chatbot_project\venv\lib\site-packages\channels\auth.py", line 185, in __call__
    return await super().__call__(scope, receive, send)
  File "C:\Users\Tamerlan\Desktop\chatbot_project\venv\lib\site-packages\channels\middleware.py", line 24, in __call__
    return await self.inner(scope, receive, send)
  File "C:\Users\Tamerlan\Desktop\chatbot_project\venv\lib\site-packages\channels\routing.py", line 116, in __call__
    return await application(
  File "C:\Users\Tamerlan\Desktop\chatbot_project\venv\lib\site-packages\channels\consumer.py", line 94, in app
    return await consumer(scope, receive, send)
  File "C:\Users\Tamerlan\Desktop\chatbot_project\venv\lib\site-packages\channels\consumer.py", line 58, in __call__
    await await_many_dispatch(
  File "C:\Users\Tamerlan\Desktop\chatbot_project\venv\lib\site-packages\channels\utils.py", line 50, in await_many_dispatch
    await dispatch(result)
  File "C:\Users\Tamerlan\Desktop\chatbot_project\venv\lib\site-packages\channels\consumer.py", line 73, in dispatch
    await handler(message)
  File "C:\Users\Tamerlan\Desktop\chatbot_project\venv\lib\site-packages\channels\generic\websocket.py", line 194, in websocket_receive
    await self.receive(text_data=message["text"])
  File "C:\Users\Tamerlan\Desktop\chatbot_project\chatbot_app\consumers.py", line 28, in receive
    await self.send(text_data=response)
  File "C:\Users\Tamerlan\Desktop\chatbot_project\venv\lib\site-packages\channels\generic\websocket.py", line 209, in send
    await super().send({"type": "websocket.send", "text": text_data})
  File "C:\Users\Tamerlan\Desktop\chatbot_project\venv\lib\site-packages\channels\consumer.py", line 81, in send
    await self.base_send(message)
  File "C:\Users\Tamerlan\Desktop\chatbot_project\venv\lib\site-packages\channels\sessions.py", line 226, in send
    return await self.real_send(message)
  File "C:\Users\Tamerlan\Desktop\chatbot_project\venv\lib\site-packages\daphne\server.py", line 240, in handle_reply
    protocol.handle_reply(message)
  File "C:\Users\Tamerlan\Desktop\chatbot_project\venv\lib\site-packages\daphne\ws_protocol.py", line 202, in handle_reply
    self.serverSend(message["text"], False)
  File "C:\Users\Tamerlan\Desktop\chatbot_project\venv\lib\site-packages\daphne\ws_protocol.py", line 256, in serverSend
    self.sendMessage(content.encode("utf8"), binary)
AttributeError: 'StreamingHttpResponse' object has no attribute 'encode'

I want to create a chatgpt chat and I want send a data look like how chatgpt sent it using streaming

class ChatConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        await self.accept()

    async def receive(self, text_data):
        # Parse the JSON message
        message = json.loads(text_data)

        # Print the message to the console
        print('Received message:', message)

        # Define a generator function to yield JSON strings one at a time
        def data_stream():
            for i in range(10):
                yield json.dumps({'message': f'Message {i}'})

        # Send the stream of data to the client
        response = StreamingHttpResponse(data_stream(), content_type='application/json')
        print(response)

        await self.send(text_data=response)

it is my consumer I want send data look like how chatgpt send data with streaming. How can I do it or it is recomended use streaming in here. I am also use in here async for but it did not help me

1

There are 1 best solutions below

0
On

According to the implementation there is no argument that accepts StreamingHttpResponse. However, you don't need it, and you can send many messages in response to one query. Channels are not in the original HTTP structure you can send only one message in response to each request. You can call the send method and send as many messages as you wish.