В момента използвам модула redis.py на Andy McCurdy, за да взаимодействам с 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, картографиране). Това е странно! expire е метод за канал.
ВТОРА АКТУАЛИЗАЦИЯ
Намерих работа за момента. Изглежда, че това се случва само в Celery. Родните изгледи на Django и конзолата на python не проявяват това поведение. Изглежда, че оценява резултата от израза преди него. Ако някой от вас се сблъска с този проблем, ето решение.
pipe.hmset(activity_key, mapping)
pipe.lpush('mylist', 1)
pipe.expire('mylist', 300)
pipe.execute()
Това трябва да работи и да не ви създава проблеми. Честито кодиране!