python - 如何使用 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
解决方案
正如我们在评论中发现的那样,celery 和 app 在不同的 docker 容器中工作。
django.core.cache.backends.filebased.FileBasedCache
将每个缓存值序列化并存储为单独的文件。但是这些文件位于不同的文件系统中。
解决方案是使用docker 卷/tmp/cache
在这两个容器之间共享文件夹。
推荐阅读
- firebase - FirebaseX APNS 令牌空
- python-3.x - 为什么读取的文件中有前面的 \ufeff?
- azure - 在 k8s 中为 pod 使用 post install
- android - 使用 minSdk 15 测试 onNotification 点击
- javascript - TypeError: sns.publish is not a function ,开玩笑模拟 AWS SNS
- angular - Angular RXJS 从嵌套的 observables 中轮询
- python - AttributeError:“numpy.ndarray”对象在将数据集拆分为 X 和 y 变量时没有属性“iloc”
- cad - 在草图上看不到智能尺寸
- angular - 什么时候空路由匹配前缀路径匹配?
- ios - 如何在 React Native App 上保护我的 api 密钥安全