Channels_redis вызывает ошибку AttributeError: объект ‘Redis’ не имеет атрибута ‘bzpopmin’

#python #django #redis #django-channels #redis-py

#python #django #redis #django-каналы #redis-py

Вопрос:

Я сталкиваюсь со следующим сообщением об ошибке в моем приложении Django:

 Exception inside application: 'Redis' object has no attribute 'bzpopmin'
Traceback (most recent call last):
  File "/home/jack/.conda/envs/GuessWhich/lib/python3.7/site-packages/channels/staticfiles.py", line 44, in __call__
    return await self.application(scope, receive, send)
  File "/home/jack/.conda/envs/GuessWhich/lib/python3.7/site-packages/channels/routing.py", line 71, in __call__
    return await application(scope, receive, send)
  File "/home/jack/.conda/envs/GuessWhich/lib/python3.7/site-packages/channels/sessions.py", line 47, in __call__
    return await self.inner(dict(scope, cookies=cookies), receive, send)
  File "/home/jack/.conda/envs/GuessWhich/lib/python3.7/site-packages/channels/sessions.py", line 254, in __call__
    return await self.inner(wrapper.scope, receive, wrapper.send)
  File "/home/jack/.conda/envs/GuessWhich/lib/python3.7/site-packages/channels/auth.py", line 181, in __call__
    return await super().__call__(scope, receive, send)
  File "/home/jack/.conda/envs/GuessWhich/lib/python3.7/site-packages/channels/middleware.py", line 26, in __call__
    return await self.inner(scope, receive, send)
  File "/home/jack/.conda/envs/GuessWhich/lib/python3.7/site-packages/channels/routing.py", line 160, in __call__
    send,
  File "/home/jack/.conda/envs/GuessWhich/lib/python3.7/site-packages/channels/consumer.py", line 94, in app
    return await consumer(scope, receive, send)
  File "/home/jack/.conda/envs/GuessWhich/lib/python3.7/site-packages/channels/consumer.py", line 59, in __call__
    [receive, self.channel_receive], self.dispatch
  File "/home/jack/.conda/envs/GuessWhich/lib/python3.7/site-packages/channels/utils.py", line 58, in await_many_dispatch
    await task
  File "/home/jack/.conda/envs/GuessWhich/lib/python3.7/site-packages/channels/utils.py", line 50, in await_many_dispatch
    result = task.result()
  File "/home/jack/.conda/envs/GuessWhich/lib/python3.7/site-packages/channels_redis/core.py", line 469, in receive
    real_channel
  File "/home/jack/.conda/envs/GuessWhich/lib/python3.7/site-packages/channels_redis/core.py", line 524, in receive_single
    index, channel_key, timeout=self.brpop_timeout
  File "/home/jack/.conda/envs/GuessWhich/lib/python3.7/site-packages/channels_redis/core.py", line 361, in _brpop_with_clean
    result = await connection.bzpopmin(channel, timeout=timeout)
AttributeError: 'Redis' object has no attribute 'bzpopmin'
 

Похоже, это происходит после создания соединения с WebSocket, при котором WebSocket отключается после возникновения ошибки.

Сначала я рассмотрел другие подобные проблемы, которые были вызваны использованием версии Redis ниже 5.0, но после ввода команды redis-cli INFO | grep version я вижу версию Redis, установленную на моем компьютере 6.0.9 , которая также применяется при вызове аналогичной функции из Python.

На данный момент я думаю, что проблема может быть связана с запуском независимой версии Redis (возможно, из-за какой-то другой зависимости?) но я не могу найти доказательства этого на своей машине или из-за обновления версии каналов с 1 до 3 и оставления некоторого устаревшего кода. Мне не удалось найти какие-либо проблемы, похожие на ту, с которой я столкнулся, и я не уверен, верна ли какая-либо из этих гипотез.

Ответ №1:

Чтобы ответить на эту проблему, с которой я столкнулся, я не уверен на 100%, что было сломано, но я использую среду conda со смесью пакетов, установленных через conda и pip (при этом pip также кажется сломанным). После удаления и воссоздания среды и установки всех пакетов с помощью pip эта проблема была решена.

Ответ №2:

у меня была такая же ошибка, и я исправил ее, обновив aioredis.