В настоящее время я использую модуль redis.py Энди Маккарди для взаимодействия с Redis из Django.
Я переношу определенные задачи в фоновый режим с помощью Celery.
Вот одна из моих задач:
import redis
pool = redis.ConnectionPool(host='XX.XXX.XXX.X', port=6379, db=0, password='password')
r_server = redis.Redis(connection_pool=pool)
pipe = r_server.pipeline()
# The number of seconds for two months
seconds = 5356800
@shared_task
def Activity(userID, object_id, timestamp):
timestamp = int(timestamp)
# Create Individual activity for each.
activity_key = 'invite:activity:%s:%s' % (userID, timestamp)
mapping = dict(
user_id = userID,
object_id = object_id)
pipe.hmset(activity_key, mapping).expire(activity_key, seconds).execute()
Всякий раз, когда эта задача вызывается, я получаю следующую ошибку:
AttributeError: 'bool' object has no attribute 'expire'
Что может быть причиной этого?
Позже я провел тест в консоли Python, чтобы увидеть, что с моим синтаксисом что-то не так, но все сработало именно так, как я планировал. Так что же может быть причиной этой ошибки?
ОБНОВЛЕНИЕ
Я думаю, что срок действия оценивает результат hmset (activity_key, mapping). Это странно! expire — это метод для канала.
ВТОРОЕ ОБНОВЛЕНИЕ
Я нашел работу вокруг на данный момент. Кажется, это происходит только внутри Celery. Собственные представления Django и консоль Python не демонстрируют такого поведения. Кажется, он оценивает результат выражения перед ним. Если кто-то из вас столкнется с этой проблемой, вот обходной путь.
pipe.hmset(activity_key, mapping)
pipe.lpush('mylist', 1)
pipe.expire('mylist', 300)
pipe.execute()
Это должно работать и не доставлять вам никаких проблем. Удачного кодирования!