Description
Version:
redis 5.0.7
pip list:
channels 4.0.0
channels-redis 4.0.0
redis 4.5.1
Platform: Windows 10 WSL2, Python 3.8.10, redis server runs on a Raspberry Pi
Description:
I am using Django channels with Redis.
I am using a channel to send a message from
View ---> AsyncConsumer (background worker)
def myview(request):
async_to_sync(channel_layer.send)( # <--- here the error occurs
"start",
{
"type": "start",
},
)
Another message is send from this AsyncConsumer --> AsyncWebsocketConsumer
class MyAsyncConsumer(AsyncConsumer):
async def start(self, event):
logger = logging.getLogger('django')
logger.info(event)
await self.channel_layer.send(
event['channel'],
{
"type": "finish",
},
)
Finally in the WebsocketConsumer, sends a Websocket message to the Websocket Client
class MyWebsocketConsumer(AsyncWebsocketConsumer):
async def finish(self, data):
logger = logging.getLogger('django')
logger.info("Reply from Worker")
message = {
"type" : "finish",
}
await self.send(json.JSONEncoder().encode(message))
When sending the message from View ---> AsyncConsumer, there is the following error:
Internal Server Error: /
Traceback (most recent call last):
File "/mnt/d/Documents/python/myapp/myapp/.venv/lib/python3.8/site-packages/asgiref/sync.py", line 486, in thread_handler
raise exc_info[1]
File "/mnt/d/Documents/python/myapp/myapp/.venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 42, in inner
response = await get_response(request)
File "/mnt/d/Documents/python/myapp/myapp/.venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 253, in _get_response_async
response = await wrapped_callback(
File "/mnt/d/Documents/python/myapp/myapp/.venv/lib/python3.8/site-packages/asgiref/sync.py", line 448, in call
ret = await asyncio.wait_for(future, timeout=None)
File "/usr/lib/python3.8/asyncio/tasks.py", line 455, in wait_for
return await fut
File "/usr/lib/python3.8/concurrent/futures/thread.py", line 57, in run
result = self.fn(*self.args, **self.kwargs)
File "/mnt/d/Documents/python/myapp/myapp/.venv/lib/python3.8/site-packages/asgiref/sync.py", line 490, in thread_handler
return func(*args, **kwargs)
File "/mnt/d/Documents/Python/myapp/myapp/myview/views.py", line 30, in myview
async_to_sync(channel_layer.send)(
File "/mnt/d/Documents/python/myapp/myapp/.venv/lib/python3.8/site-packages/asgiref/sync.py", line 240, in call
return call_result.result()
File "/usr/lib/python3.8/concurrent/futures/_base.py", line 437, in result
return self.__get_result()
File "/usr/lib/python3.8/concurrent/futures/_base.py", line 389, in __get_result
raise self._exception
File "/mnt/d/Documents/python/myapp/myapp/.venv/lib/python3.8/site-packages/asgiref/sync.py", line 306, in main_wrap
result = await self.awaitable(*args, **kwargs)
File "/mnt/d/Documents/python/myapp/myapp/.venv/lib/python3.8/site-packages/channels_redis/core.py", line 218, in send
await connection.zremrangebyscore(
File "/mnt/d/Documents/python/myapp/myapp/.venv/lib/python3.8/site-packages/redis/asyncio/client.py", line 514, in execute_command
return await conn.retry.call_with_retry(
File "/mnt/d/Documents/python/myapp/myapp/.venv/lib/python3.8/site-packages/redis/asyncio/retry.py", line 59, in call_with_retry
return await do()
File "/mnt/d/Documents/python/myapp/myapp/.venv/lib/python3.8/site-packages/redis/asyncio/client.py", line 488, in _send_command_parse_response
return await self.parse_response(conn, command_name, **options)
File "/mnt/d/Documents/python/myapp/myapp/.venv/lib/python3.8/site-packages/redis/asyncio/client.py", line 547, in parse_response
retval = self.response_callbacks[command_name](response, **options)
TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'
The AsyncConsumer worker never receives the message.
Channel Router Configuration:
application = ProtocolTypeRouter({
"http": django_asgi_app,
"channel": ChannelNameRouter({
"start": MyAsyncConsumer.as_asgi(),
}),
"websocket": AllowedHostsOriginValidator(
AuthMiddlewareStack(URLRouter(myapp.routing.websocket_urlpatterns))
),
})