django-pipeline在Django Database Cache中清除我的条目

时间:2016-04-21 01:26:51

标签: python django django-database django-cache django-pipeline

我正在使用Django应用程序,该应用程序使用django-pipeline来处理浏览器的文件缓存问题(以及其他好处)。

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并创建了表格。我将条目放入此表但没有到期日期,因为我有自己的有效性检查,并且可以自行决定数据是否是最新的,或者需要重新计算。

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

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

除了明确的答案:知道任何人都可以搞乱默认缓存+静态文件可以粗暴地删除它,将我们和其他人分开更好:

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',
    }
}

1 个答案:

答案 0 :(得分:2)

为静态文件定义单独的缓存将解决此问题。 Django默认查找" staticfiles"先缓存。 例如:

CExcelApplication excelApp;
CExcelWorkbooks pBooks;
CExcelWorkbook workbook;
CExcelWorksheets pSheets;
CExcelWorksheet pSheet;
CExcelRange oRange;

if ( FAILED( excelApp.CreateDispatch( _T("Excel.Application") ) ) )
{
return;
}
COleVariant varOption( (long) DISP_E_PARAMNOTFOUND, VT_ERROR );
pBooks = excelApp.get_Workbooks();
workbook =  pBooks.Open( m_strFileName, varOption, varOption, varOption, varOption, varOption, varOption, varOption, varOption, varOption, varOption, varOption, varOption, varOption, varOption);

pSheets = workbook.get_Worksheets();
pSheet = pSheets.get_Item(COleVariant((short)1));
oRange = pSheet.get_UsedRange();
COleSafeArray saRet(oRange.get_Value(varOption));

long iRows;
long iCols;
saRet.GetUBound(1, &iRows);
saRet.GetUBound(2, &iCols);

// Loop through the data and report the contents.
for (int rowCounter = 1; rowCounter <= iRows; rowCounter++) {
for (int colCounter = 1; colCounter <= iCols; colCounter++) {
    ...     }
}
////// Don't save any inadvertant changes to the .xls file.
oRange.ReleaseDispatch();
pSheet.ReleaseDispatch();
pSheets.ReleaseDispatch();
pSheet = NULL;
pSheets = NULL;

workbook.Close(COleVariant((short)FALSE), varOption, varOption);
workbook.ReleaseDispatch();
workbook = NULL;

pBooks.Close();
pBooks.ReleaseDispatch();
pBooks = NULL;

excelApp.Quit();
excelApp.ReleaseDispatch();
excelApp = NULL;