我在 1.3 版本的 django 上遇到了奇怪的缓存问题。我可能有一些配置错误,但不确定是什么。
一个很好的例子是 django-avatar,它使用缓存并且很多人使用它。即使我没有定义缓存后端,头像似乎已被缓存,这本身就可以,但它会不断在缓存的最后一个值之间来回切换。示例:我上传了一个新头像,现在大约 50% 的请求会显示新头像,50% 显示旧头像。如果我删除旧的,我仍有 50% 的时间会在网站上看到它。修复它的唯一方法是通过将其设置为一秒来禁用头像的缓存。
首先我认为这是因为我使用了 django.core.cache.backends.locmem.LocMemCache,我以前从未使用过,但是当我根本没有配置缓存后端时它甚至会发生。
我发现了一个类似的错误: Django缓存错误..即使缓存被禁用
但是我的页面渲染得很好,它的模板标签(现在)会导致我的设置出现问题。
我使用 django 1.3、postgres、nginx、gunicorn 0.12.0、greenlet==0.3.1、eventlet==0.9.16
我只是做了一些更多的测试,并意识到它只有在我使用配置文件启动 gunicorn 时才会发生。如果我从 ./manage.py run_gunicorn 开始,一切都很好。运行“gunicorn_django -c deploy/gunicorn.conf.py”会导致问题。
我能想到的唯一解释是每个工人都有自己的缓存(我想知道为什么,因为我没有定义缓存)。
更新:运行 ./manage.py run_gunicorn -w 4 也会导致同样的问题。因此,我几乎可以肯定是多个工作人员导致了问题,并且每个工作人员分别缓存了这些值。
我的配置:
import os
import socket
import sys
PORT = 8000
PROC_NAME = 'myapp_gunicorn'
LOGFILE_NAME = 'gunicorn.log'
TIMEOUT = 3600
IP = '127.0.0.1'
DEPLOYMENT_ROOT = os.path.dirname(os.path.abspath(__file__))
SITE_ROOT = os.path.abspath(os.path.sep.join([DEPLOYMENT_ROOT, '..']))
CPU_CORES = os.sysconf("SC_NPROCESSORS_ONLN")
sys.path.insert(0, os.path.join(SITE_ROOT, "apps"))
bind = '%s:%s' % (IP, PORT)
logfile = os.path.sep.join([DEPLOYMENT_ROOT, 'logs', LOGFILE_NAME])
proc_name = PROC_NAME
timeout = TIMEOUT
worker_class = 'eventlet'
workers = 2 * CPU_CORES + 1
我也尝试过不使用'eventlet',但得到了同样的错误。
谢谢你的帮助。