2016-04-21 47 views
1

我正在研究Django应用程序,该应用程序使用django-pipeline来处理浏览器的文件缓存问题(以及其他好处)。django-pipeline消除了我在Django数据库缓存中的条目

STATIC_URL = '/static/' 

STATICFILES_STORAGE = 'pipeline.storage.PipelineCachedStorage' 

STATICFILES_DIRS = (
    os.path.join(PROJECT_ROOT, 'bower'), 
) 

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder', 
    'django.contrib.staticfiles.finders.AppDirectoriesFinder', 
    'pipeline.finders.PipelineFinder', 
    'pipeline.finders.CachedFileFinder', 
) 

PIPELINE = {} 
PIPELINE['DISABLE_WRAPPER'] = True 
PIPELINE['JS_COMPRESSOR'] = 'pipeline.compressors.NoopCompressor' 
PIPELINE['CSS_COMPRESSOR'] = 'pipeline.compressors.yuglify.YuglifyCompressor' 

PIPELINE['COMPILERS'] = (
    'pipeline.compilers.sass.SASSCompiler', 
    'pipeline.compilers.es6.ES6Compiler', 
) 

PIPELINE['JAVASCRIPT'] = { 
... 
} 

PIPELINE['STYLESHEETS'] = { 
... 
} 

PIPELINE['SASS_BINARY'] = 'C:\\Ruby22-x64\\bin\\sass.bat' 
PIPELINE['BABEL_BINARY'] = 'c:\\Users\\Foobar\\node_modules\\.bin\\babel.cmd' 

到目前为止好。最近我们决定使用Django的数据库缓存(https://docs.djangoproject.com/en/1.9/topics/cache/#database-caching)来缓存一些长时间运行的统计计算结果。

CACHES = { 
    'default': { 
     'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 
     'LOCATION': 'django_dbcache', 
    } 
} 

我执行了createcachetable并创建了表。由于我有自己的有效性检查,并且可以自己判断数据是最新的还是需要重新计算,所以我将条目放入此表中,但没有到期日期。

但令我惊讶的是,当我为pipeline发出collectstatic时,它清除了该表的内容,并用它自己的staticfiles:{md5code}键值填充它。 (在生产中,我看到了它没有消除所有东西的情况)。但是这使得我的缓存方案无法使用。我似乎无法找到管道文档中的任何设置如何停止pipeline这样做。 pipeline在缓存中的缓存条目值非常短,仅包含生成文件的完整路径。这些条目的到期时间是几个小时。我不会介意他们在那里,只是不要擦拭我的东西。


附加说明:我在Windows平台上(请参阅上面的管道设置),但同样的事情发生在Linux生产服务器上。


加入到标记的回答:知道,任何人都可以乱用默认缓存+ staticfiles可以毫不客气地消灭它,它甚至不如我们和其他人分开:

CACHES = { 
    'default': { 
     'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 
     'LOCATION': 'default-cache', 
    }, 
    'staticfiles': { 
     'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 
     'LOCATION': 'static-files', 
    }, 
    'my_dbcache': { 
     'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 
     'LOCATION': 'django_dbcache', 
    } 
} 

回答

2

定义独立缓存静态文件将解决问题。 Django默认首先查找“staticfiles”缓存。 示例:

CACHES = { 
'default': { 
    'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 
    'LOCATION': 'django_dbcache', 
}, 
'staticfiles': { 
    'BACKEND': "django.core.cache.backends.locmem.LocMemCache", 
    'LOCATION': 'static-files', 
}