首页 > 解决方案 > 如何使用 Django 在任务和视图之间共享缓存?

问题描述

在我的 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 文件夹时,我可以看到更新的缓存

更新2:

webapp 可以写入缓存。

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

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

print(cache.get('test'))

它说 :

None

当任务尝试从缓存中写入时,它仍然会得到 Errno13

标签: pythondjangocelery

解决方案


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

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

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


推荐阅读