如何使用Django在任务和视图之间共享缓存?

时间:2018-11-01 11:40:34

标签: python django celery

在我的django项目中,我每隔5分钟运行一次任务(使用Celery和Redis作为代理):

from django.core.cache import cache

@shared_task()
@celery.task(base=QueueOnce)
def cache_date():
    cache.set('date', datetime.now)
    print('Cached date : ', cache.get('date'))

它运行良好,每次运行时都打印新的缓存日期

但是然后,在我的一种观点中,我尝试这样做:

from django.core.cache import cache

def get_cached_date():
    print('Cached date :', cache.get('date')

然后显示“缓存日期:无”

这是我的缓存设置:

CACHES = {
   'default': {
      'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
      'LOCATION': '/tmp/cache',
   }
}

我不明白,为什么当我使用单一位置文件时,该值在一个地方可用而在另一个地方不可用?我在尝试做错什么吗?

更新

@Satevg我使用docker-compose,这是我的文件:

services:
  redis:
    image: redis

  worker:
    image: project
    depends_on:
      - redis
      - webserver
    command: project backend worker
    volumes:
    - cache:/tmp/cache

  webserver:
    image: project
    depends_on:
      - redis
    volumes:
      - cache:/tmp/cache

volumes:
  cache:

我试图共享这样的卷,但是当我的任务试图写入缓存时,我得到了:

OSError: [Errno 13] Permission denied: '/tmp/cache/tmpAg_TAc'

当我查看两个容器中的文件系统时,我可以看到文件夹/ tmp / cache,Web应用程序甚至可以在其上写东西;当我查看工作人员的容器/ tmp / cache文件夹时,我可以看到更新的缓存< / p>

UPDATE2:

Web应用程序可以写入缓存。

cache.set('test', 'Test')

在工作人员的容器上,我可以看到/ tmp / cache文件夹中的缓存文件 当任务尝试从缓存中读取时:

print(cache.get('test'))

它说:

None

当任务尝试从缓存中写入数据时,它仍会显示Errno13

1 个答案:

答案 0 :(得分:0)

正如我们在评论中指出的那样,celery和app在不同的docker容器中工作。

django.core.cache.backends.filebased.FileBasedCache序列化每个缓存值并将其存储为单独的文件。但是这些文件位于不同的文件系统中。

解决方案是使用docker volumes以便在这两个容器之间共享/tmp/cache文件夹。

相关问题