繁体   English   中英

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

[英]How to share cache between a task and a view with 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文件夹时,我可以看到更新后的缓存

UPDATE2:

Webapp可以写入缓存。

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

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

print(cache.get('test'))

它说 :

None

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM